附注

附注

我正在使用运行 PHP 文件

nohup php server.php &

它侦听特定端口并根据输入执行操作。

问题是有时脚本会停止。我无法使用 cron 作业来解决此问题,因为我的服务器一直在侦听端口并且正在创建子进程。

有没有办法检查是否server.php正在运行并(如果没有)启动它?

答案1

您可以使用 检查进程ps,但一个缺点是,如果您有该进程的多个实例正在运行,或者脚本挂起,则此方法可能无法得出结论。

我更喜欢实际检查服务器是否正在侦听端口。这里有几种方法可以做到这一点。例如,如果您的服务器正在侦听端口 2000,请考虑以下事项。

使用lsof

lsof -i :2000; echo $?;

lsof正在检查打开的文件描述符,并应显示程序是否正在侦听或主动在此端口上进行通信。0如果服务器正在端口 2000 上接受连接,则将回显 a,1否则将回显a。

使用nc

nc -z -w1 192.168.1.12 2000 &> /dev/null; echo $?;

这是我检查套接字服务器的首选方法。这里nc使用-z零I/O模式的标志来快速扫描端口。您可以在此处使用您的 IP 地址和正确的端口。如果服务器正在接受连接,那么生活就很好。

同样,这里的返回值要么是0好的,要么1是不好的。我们在这里丢弃任何输出,因为我们只想进行快速布尔检查。如果网络地址可达,则此方法返回速度非常快。从服务器本身运行,您几乎看不到任何延迟,因为它试图与自己对话。

自动化

要通过 cron 运行这些测试,请创建一个 bash 脚本并执行其中一个或两个命令,并运行一系列逻辑检查。如果失败,请重新启动您的脚本并重新检查。我已经使用这些方法好几年了,并且在实际正常运行时间方面取得了非常好的结果。

答案2

聚会有点晚了...

通过使用重新启动的守护进程,您可以运行程序和 bash 脚本。 Restartd 将每 20 秒(可配置)检查一次列表中的程序是否正在运行。

请参阅手册页这里

答案3

不确定这能解决您的 XY 问题

if ps -C php -o args h | grep -q server.php
then true ## php server.php running
else php server.php ## not running
fi

附注

  • -C php将搜索 php 实例,
  • -o args将显示完整的命令行,
  • h无标题

grep

  • -q安静

这将检查程序是否php server.php正在运行,如果程序停止,进程将在这里并且不会重新启动。

真正的解决方案包括使用任何连接轮询 server.php,期望在没有超时的情况下得到知道的答案。如果失败重新启动。

相关内容