有没有办法在 Linux 系统上暂停正在运行的进程并稍后恢复?

有没有办法在 Linux 系统上暂停正在运行的进程并稍后恢复?

我必须在机器上复制文件。而且数据非常大。现在服务器需要正常服务,并且通常有特定的繁忙时间范围。那么有没有一种方法可以运行这样的命令,如果服务器遇到繁忙时间,它会暂停进程,当它超出该范围时,它会恢复它?

预期结果

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 文件来进行清理,等等。

换句话说,您需要更多围绕这一点来建立可靠的,但使用这些SIGSTOPSIGCONT信号来暂停/恢复进程执行的基本思想似乎正是您正在寻找的。

答案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 只是暂停命令并稍后恢复它,这会让你很容易受到攻击,如果你不小心注销,你将无法恢复你的会话。

使用屏幕,我相信您可以中断会话,然后将其分离并注销。稍后您可以返回并重新连接到该会话。你必须尝试一下它,但它使会话变得更加健壮。

您还可以注销并回家,然后远程登录,重新连接到您在办公室启动的系统并在晚上恢复它,然后在第二天工作时再次使用它。

相关内容