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 信号暂停/恢复进程执行的基本思想似乎正是您正在寻找的。
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 时获取磁盘时间。
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)
归档时间: |
|
查看次数: |
13143 次 |
最近记录: |