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

Sol*_*osa 40 process process-management

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

预期结果

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.
Run Code Online (Sandbox Code Playgroud)

fil*_*den 80

您可以通过向进程发送 SIGSTOP 信号来暂停进程的执行,然后通过向其发送 SIGCONT 来恢复进程。

假设您的工作负载是单个进程(不会在后台运行 fork 助手),您可以使用以下内容:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid
Run Code Online (Sandbox Code Playgroud)

然后当忙碌时间开始时,向它发送一个 SIGSTOP:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"
Run Code Online (Sandbox Code Playgroud)

稍后,当服务器再次空闲时,将其恢复。

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"
Run Code Online (Sandbox Code Playgroud)

您需要在希望执行时将其安排在特定时间,您可以使用诸如 cron 或 systemd 计时器(或各种其他类似工具)之类的工具来安排此安排。您可以选择监视服务器(可能查看平均负载、CPU 使用情况或服务器日志中的活动)来决定何时暂停/恢复复制,而不是基于时间间隔进行调度。

您还需要管理 PID 文件(如果您使用),在暂停之前确保您的副本实际上仍在运行,可能您希望在副本完成后通过删除 pidfile 进行清理,等等。

换句话说,您需要更多地解决这个问题才能可靠,但使用这些 SIGSTOP 和 SIGCONT 信号暂停/恢复进程执行的基本思想似乎正是您正在寻找的。

  • +1 另见 https://utcc.utoronto.ca/~cks/space/blog/unix/SIGSTOPUsesAndCautions (7认同)

Sté*_*las 77

除了暂停进程,您还可以给它较低的优先级:

renice 19 "$pid"
Run Code Online (Sandbox Code Playgroud)

会给它最低的优先级(最高的好度),以便该进程将 CPU 交给大多数时间需要它的其他进程。

在 Linux 上,同样可以通过 I/O 完成ionice

ionice -c idle -p "$pid"
Run Code Online (Sandbox Code Playgroud)

将进程放在“空闲”类中,这样它只会在没有其他程序在定义的宽限期内要求磁盘 I/O 时获取磁盘时间

  • 这是一个典型的 [XY 问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。问题是如何暂停进程,但这并没有回答问题。虽然确实降低优先级是解决*实际*问题的更好方法,但它并没有回答这个问题。我会[编辑] 问题还包括如何暂停进程以及为什么暂停可能是一个问题(例如,可以在暂停时编辑文件)。 (22认同)
  • @DavidStockinger,从技术上讲,这个答案告诉操作系统在它(操作系统、CPU、I/O 调度程序)忙碌时如何告诉操作系统暂停进程(即使它一次只有几分之一秒)。其他答案中已经介绍了如何手动暂停进程。此解决方案没有解决文件在复制时被修改的问题。 (22认同)
  • 更改 I/O 优先级并不总是最好的解决方案。如果您正在从旋转磁盘复制,您可能仍会在每个高优先级请求之前发生寻道,如果您完全暂停低优先级操作,则不会发生寻道。 (5认同)
  • 较低的优先级甚至不能解决问题。即使盒子完全空闲几秒钟或几分钟,这并不意味着将从文件系统缓存中逐出所有内容的巨大复制过程将不引人注目。一旦再次加载,将所有内容重新分页将非常缓慢。 (2认同)
  • @DavidStockinger 处理 XY 问题的首选方法是提供 _right_ 解决方案,即使这不是问题所要求的。当您知道问题中描述的方法是错误的时,好的答案不会给出错误的方法,而是会提出更好的方法。 (2认同)
  • 不幸的是,这意味着人们在搜索问题中字面上讨论的内容时只能找到其他问题的答案。XY 问题的一个好的答案给出了首选的替代方案_作为答案的奖励部分_,同时仍然回答提出的问题(或者您可以在评论中提出替代问题)。幸运的是,在这种情况下,这里的其他答案确实可以做到这一点。 (2认同)

ger*_* d. 12

是的,您需要获取要暂停的进程的进程ID(通过ps命令),然后执行:

$> kill -SIGSTOP <pid>
Run Code Online (Sandbox Code Playgroud)

然后该过程将显示为状态“T”(在 中ps)。

要继续,请执行以下操作:

$> kill -CONT <pid>
Run Code Online (Sandbox Code Playgroud)


小智 8

对于这种情况,使用 rsync,忘记 cp。有参数可以限制带宽,或者可以被杀死/停止并稍后启动,以某种方式继续,它离开 google rsync example/s