我必须在机器上复制文件。而且数据非常大。现在服务器需要正常服务,并且通常有特定的繁忙时间范围。那么有没有一种方法可以运行这样的命令,如果服务器遇到繁忙时间,它会暂停进程,当它超出该范围时,它会恢复它?
预期结果
cp src dst
if time between 9:00-14:00 pause process
After 14:00 resume cp command.
答案1
您可以通过向进程发送信号来暂停进程的执行SIGSTOP
,然后通过向其发送SIGCONT
.
假设您的工作负载是单个进程(不会在后台运行分叉助手),您可以使用如下内容:
# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid
然后,当繁忙时间开始时,发送SIGSTOP
:
# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"
稍后,当服务器再次空闲时,恢复它。
# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"
您需要将其安排在您希望执行的特定时间,您可以使用 cron 或 systemd 计时器等工具(或各种其他类似工具)来安排此计划。您可以选择监视服务器(可能查看负载平均值、CPU 使用率或服务器日志中的活动)来决定何时暂停/恢复复制,而不是基于时间间隔进行调度。
您还需要管理 PID 文件(如果您使用一个),确保您的副本在暂停之前实际上仍在运行,您可能需要在副本完成后通过删除 PID 文件来进行清理,等等。
换句话说,您需要更多围绕这一点来建立可靠的,但使用这些SIGSTOP
和SIGCONT
信号来暂停/恢复进程执行的基本思想似乎正是您正在寻找的。
答案2
除了暂停该进程之外,您还可以给它较低的优先级:
renice 19 "$pid"
会给它最低的优先级(最高的优先级),这样该进程就会将CPU让给其他大多数时候需要它的进程。
在 Linux 上,可以使用 I/O 完成相同的操作ionice
:
ionice -c idle -p "$pid"
会将进程放入“idle”类中,这样它仅当没有其他程序在定义的宽限期内请求磁盘 I/O 时才会获取磁盘时间。
答案3
是的,您需要获取要暂停的进程的进程ID(通过命令ps
),然后执行以下操作:
$> kill -SIGSTOP <pid>
然后,该进程将显示状态“T”(在 中ps
)。
要继续,请执行以下操作:
$> kill -CONT <pid>
答案4
如果您打算通过中断正在运行的进程来完成此操作,我建议使用 Screen 程序。我已经有一段时间没有使用 Linux 了,但是 IIRC 只是暂停命令并稍后恢复它,这会让你很容易受到攻击,如果你不小心注销,你将无法恢复你的会话。
使用屏幕,我相信您可以中断会话,然后将其分离并注销。稍后您可以返回并重新连接到该会话。你必须尝试一下它,但它使会话变得更加健壮。
您还可以注销并回家,然后远程登录,重新连接到您在办公室启动的系统并在晚上恢复它,然后在第二天工作时再次使用它。