我必须在机器上复制文件。而且数据非常庞大。现在服务器需要正常服务,并且通常有特定范围的繁忙时间。那么有没有一种方法来运行这样的命令,如果服务器达到繁忙时间,它会暂停进程,当它超出该范围时,它会恢复它?
预期结果
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
我必须在机器上复制文件。而且数据非常庞大。现在服务器需要正常服务,并且通常有特定范围的繁忙时间。那么有没有一种方法来运行这样的命令,如果服务器达到繁忙时间,它会暂停进程,当它超出该范围时,它会恢复它?
预期结果
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
您可以通过向其发送
SIGSTOP
信号来暂停进程的执行,然后通过向其发送SIGCONT
.假设您的工作负载是单个进程(不会在后台运行 fork 助手),您可以使用以下内容:
然后当繁忙时间开始时,发送一个
SIGSTOP
:稍后,当服务器再次空闲时,恢复它。
您需要将其安排在您希望它执行的特定时间,您可以使用诸如 cron 或 systemd 计时器(或各种其他类似工具)之类的工具来安排此计划。您可以选择监视服务器(可能查看负载平均值、CPU 使用率或服务器日志中的活动)来决定何时暂停/恢复复制,而不是基于时间间隔进行调度。
您还需要管理 PID 文件(如果您使用一个),在暂停之前确保您的副本实际上仍在运行,可能您需要在复制完成后通过删除 PID 文件来进行清理,等等。
换句话说,您需要更多地围绕这一点来实现可靠,但使用这些
SIGSTOP
和SIGCONT
信号来暂停/恢复进程执行的基本思想似乎是您正在寻找的。除了暂停进程,您还可以给它较低的优先级:
会给它最低的优先级(最高的niceness),这样这个进程就会把CPU让给其他大部分时间需要它的进程。
在 Linux 上,同样可以使用 I/O 完成
ionice
:将进程置于“空闲”类中,这样它只会在没有其他程序在定义的宽限期内请求磁盘 I/O 时才获得磁盘时间。
是的,您需要获取要暂停的进程的进程ID(通过
ps
命令),然后执行:然后该过程将显示状态“T”(在 中
ps
)。要继续,请执行以下操作:
对于这种情况,请使用 rsync,忘记 cp。有限制带宽的参数,或者可以被杀死/停止并稍后启动,以某种方式它将继续,它离开谷歌 rsync 示例/s
如果您打算通过中断正在运行的过程来做到这一点,我建议您使用 Screen 程序。我有一段时间没有使用 Linux,但是 IIRC 只是暂停命令并稍后恢复它会让你很容易受到攻击,如果你不小心被注销,你将无法恢复会话。
使用屏幕,我相信您可以中断会话,然后将其分离并注销。稍后您可以返回并重新连接到该会话。你必须玩一点,但它使会话更加健壮。
您也可以注销并回家,然后远程登录,重新连接到您在办公室启动的系统并在晚上恢复它,然后在第二天工作时再次使用它。
如果您的 shell 支持它(几乎所有支持),您可以按 ^Z (Ctrl+Z) 轻松向前台
SIGTSTP
任务发送信号,然后使用fg
(on foreground) 或bg
(on background) 继续它。如果您对多个任务执行此操作并希望稍后返回它们,您可以使用
jobs
命令,然后返回 withfg/bg %#
,其中 # 是作业括号中给出的数字。请记住,这
SIGTSTP
与(用于所有其他答案)有点不同SIGSTOP
,最重要的是因为它可以被忽略(但我没有看到除 之外的程序会忽略它sl
)。可以在 StackOverflow 上的这个答案中找到更多详细信息。