gab*_*be. 6 scripting process portability
让我们假设另一个用户启动了一个 bunzip 进程,我有一个脚本,我想在该 bunzip 完成后开始运行。从我的脚本内部检查 bunzip 过程是否已完成的最佳方法是什么?使用ps指定的 pid 调用 ?一个 pgrep bunzip?假设我将我的脚本放入一个 crontab 中,该 crontab 每 5 分钟检查一次以查看它是否可以运行。还假设我不想停止 bunzip,因为它已经运行了一个多小时,可能还需要一个小时才能完成。
我的第一反应是使用类似的东西
if `ps -p 12938`
# bunzip is done, execute the code
fi
# exit
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有更好的方法。另外,我不确定跨unix ps -pid 是如何。
ps -p $pid是POSIX并且应该适用于任何现代非嵌入式 unix(不是古董或Minix或BusyBox)。
通过给定的 PID 测试是否存在进程的一种简单且可移植的方法是kill -0 $pid. 这仅在您可以向进程发送信号时才有效(信号 0 的行为就像一个始终传递但没有效果的信号),这意味着它kill在进程的有效 UID 下或以 root 身份运行。如果kill以其他用户身份运行,您可以测试它是否发出“无此类进程”(ESRCH) 或“不允许操作”(EPERM) 的信号,但这需要从 shell 了解您的实现将如何格式化错误消息。
您提议的设计有一个主要缺陷:您如何知道该 PID 是否是您正在等待的 bunzip 进程?也许 bunzip 已经完成了,现在有另一个带有旧 PID 的进程。唯一可以可靠地等待进程终止的地方是它的父进程。
更好的方法是在未压缩文件存在和压缩文件不存在时触发,或者检查未压缩文件没有被任何进程打开(使用lsof)。
我认为使用 ps 没有任何问题,但这里有一个替代方案
if [ -e /proc/${PID} -a /proc/${PID}/exe ]
% process active
else
% process no longer active
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16003 次 |
| 最近记录: |