终端:以标识符或指定名称在后台运行程序

终端:以标识符或指定名称在后台运行程序

如何运行程序或脚本并稍后识别它以检查它是否仍在运行?

例如:我正在后台运行一个 PHP 脚本,该脚本运行了大约 10 个小时(从不同的 API 等获取大量数据)。当我跑步时顶部我看到了过程php仍在运行。但是如果我同时运行第二个 PHP 脚本怎么办?如何识别哪个是第一个,哪个是第二个?

我需要它,因为我想知道脚本在几个小时后是否仍在运行。

更新

我使用以下命令来识别 PHP 进程并查看它是否仍在运行:

ps cax | grep "php$" | grep -o '^[ ]*[0-9]*'

我将它与 PHP 一起使用$pid = exec("..");,然后检查是否$pid大于 0。如果不大于 0,则它没有运行,否则它正在运行,并且我有进程 ID。

答案1

使用直接运行脚本舍邦#!/usr/bin/php在第一行并将脚本标记为可执行)。ps ax将在输出中显示脚本名称,例如/usr/bin/php /path/to/your/script

或者,您可以将 PID 从调用脚本保存到另一个文件中。要检查脚本是否正在运行,请检查具有该 PID 的进程是否存在(您可能还应该检查该进程cmdline是否exec匹配,因为 PID 会被重用)。

正如所解释的@B层的回答同样,这两者都不是 100% 可靠的。

答案2

简短的回答:你不能。

中等答案:在启动 PHP 进程的父进程之外,您无法 100% 可靠地识别该进程。

长答案:Bash 进程管理

归根结底topps不能依赖 、 等来明确标识由另一个进程启动的进程。进程意外终止。 PID 被回收。进程名称可以更改。

您可以从单个长期守护进程/进程启动所有内容吗?这是你最好的选择。至少让父进程存储 PHP 进程的 PID...尽管这并不是万无一失的。如果您愿意承担出现严重错误的风险,请阅读该页面以找出减轻风险的方法。

(当然,该页面的基调相当僵化,但该网站的目标是正确性。如果您没有运行关键任务服务或人们生活所依赖的东西,您可以稍微捏造一些东西。)

要回答第二部分,如果您有您认为正确的 PID,那么您可以确定它是否仍在运行

kill -0 <PID> && echo 'The process is still running!'

相关内容