如何测试程序是否从脚本内运行

如何测试程序是否从脚本内运行

假设另一个用户启动了一个 Bunzip 进程,并且我有一个脚本,希望在 Bunzip 完成后开始运行。从脚本内部检查 Bunzip 进程已完成的最佳方法是什么?ps指定 pid 的调用?一个 pgrep 包?假设我将脚本放入一个 crontab 中,每 5 分钟检查一次,看看它是否可以运行。还假设我不想停止bunzip,因为它已经运行了一个多小时,可能还需要一个小时才能完成。

我的第一反应是使用类似的东西

if `ps -p 12938`
    # bunzip is done, execute the code
fi 
    # exit

但是,我想知道是否有更好的方法。另外,我不确定 ps -pid 是如何跨unix的。

答案1

您明显的问题:测试具有给定 PID 的进程是否存在

ps -p $pidPOSIX并且应该适用于任何现代非嵌入式 UNIX(不是古董或者迷你克斯或者忙碌盒)。

测试给定 PID 是否存在进程的一种简单且可移植的方法是kill -0 $pid。仅当您可以向进程发送信号(信号 0 的行为类似于始终传递但无效的信号)时,这才有效,这意味着该进程kill正在进程的有效 UID 下运行或作为 root 运行。如果kill以其他用户身份运行,您可以测试它是否发出“没有此类进程”(ESRCH) 或“不允许操作”(EPERM) 的信号,但是从 shell 中,这需要知道您的实现将如何格式化错误消息。

您的底层设计:测试流程是否已完成

您提出的设计有一个重大缺陷:您如何知道该 PID 是否是您正在等待的 Bunzip 进程?也许bunzip 已经完成,现在有另一个带有旧PID 的进程。唯一可以可靠地等待进程终止的地方是其父进程。

更好的方法是触发未压缩文件的存在以及压缩文件不存在的情况,或者检查未压缩文件是否未被任何进程打开(使用lsof)。

答案2

我认为使用 ps 没有什么问题,但这里有一个替代方案

if [ -e /proc/${PID} -a /proc/${PID}/exe ]
    % process active
else
    % process no longer active
fi

答案3

有几个选择。

  • 使用 ps 并查找 PID。不过你需要知道进程的 PID。
  • 使用 ps 并查找 Bunzip,需要查看完整的命令行。
  • 使用 lsof 并查看何时不再访问源文件。
  • 相同,但检查解压缩的文件是否仍在访问。

这些都不是真正万无一失或干净的。

最简单的方法是脱离用户的控制并编写一个脚本来执行解压缩,然后运行您的代码。

如果这不可能,请要求用户创建脚本,在解压缩文件时在磁盘上创建 pid 文件。然后您可以查找 PID 文件。

相关内容