Php shell脚本以检查另一个脚本的状态并重新启动它
我希望有一个无限运行的shell scit,不断检查php脚本(比如my.php)的状态,并在脚本以某种方式终止时重新启动它。我有这个想法-Php shell脚本以检查另一个脚本的状态并重新启动它,php,shell,Php,Shell,我希望有一个无限运行的shell scit,不断检查php脚本(比如my.php)的状态,并在脚本以某种方式终止时重新启动它。我有这个想法- ps -aux | grep "my.php" 然后使用此结果检查状态并执行相应操作。提前谢谢。你可以简单地说: ps -aux | grep -q "my.php" || php -f my.php 它的工作方式是grep-q不会输出任何东西,但是如果发现了什么,它会返回一个OK退出代码。当它返回NOT OK退出代码时,| |或之后的部分由于布尔短路
ps -aux | grep "my.php"
然后使用此结果检查状态并执行相应操作。提前谢谢。你可以简单地说:
ps -aux | grep -q "my.php" || php -f my.php
它的工作方式是grep-q不会输出任何东西,但是如果发现了什么,它会返回一个OK退出代码。当它返回NOT OK退出代码时,| |或之后的部分由于布尔短路求值而被执行-查找它
您还需要确保:
您可以在后台运行新脚本,并将其与控制台分离,以便脚本可以保持监视
当你运行ps | grep时,有时候ps也会列出你的grep,然后是grep greps本身,所以你必须过滤掉它
它应该是这样的:
while true
ps -aux | grep -v grep | grep -q "my.php" || ( nohup php -f "my.php" & )
sleep 1
done
或者一些类似的..你可以简单地说:
ps -aux | grep -q "my.php" || php -f my.php
它的工作方式是grep-q不会输出任何东西,但是如果发现了什么,它会返回一个OK退出代码。当它返回NOT OK退出代码时,| |或之后的部分由于布尔短路求值而被执行-查找它
您还需要确保:
您可以在后台运行新脚本,并将其与控制台分离,以便脚本可以保持监视
当你运行ps | grep时,有时候ps也会列出你的grep,然后是grep greps本身,所以你必须过滤掉它
它应该是这样的:
while true
ps -aux | grep -v grep | grep -q "my.php" || ( nohup php -f "my.php" & )
sleep 1
done
另一种方法是,在循环中启动php程序:
for ((;;))
do
my.php
done
使用Linux ps,您可以使用
ps -C "my.php"
而不是grep,来标识my.php。Grep命令经常发现它们自己。也许你的ps也有类似的开关 另一种方法是,在循环中启动php程序:
for ((;;))
do
my.php
done
使用Linux ps,您可以使用
ps -C "my.php"
而不是grep,来标识my.php。Grep命令经常发现它们自己。也许你的ps也有类似的开关 如果你真的觉得有必要对ps的输出进行grep,那就要当心grep本身
[ghoti@pc ~]$ sleep 60 &
[1] 66677
[ghoti@pc ~]$ ps aux | grep sleep
ghoti 66677 0.0 0.0 3928 784 11 S 4:11PM 0:00.00 sleep 60
ghoti 66681 0.0 0.0 16440 1348 11 S+ 4:12PM 0:00.00 grep sleep
[ghoti@pc ~]$
有一种简单的方法可以避免这种情况。只需将grep的一部分转换为更复杂的正则表达式
[ghoti@pc ~]$ sleep 60 &
[2] 66717
[ghoti@pc ~]$ ps aux | grep '[s]leep'
ghoti 66677 0.0 0.0 3928 784 11 S 4:11PM 0:00.00 sleep 60
ghoti 66717 0.0 0.0 3928 784 11 S 4:13PM 0:00.00 sleep 60
[ghoti@pc ~]$
另一方面,如果您只是想确保您的PHP脚本始终运行,那么可以将它包装成某种东西,在它死后重新运行:
while true; do
php /path/to/my.php
done
如果希望在启动时运行此功能,可以在服务器上编辑crontab,并使用@reboot标记,假设您在Linux和BSD上使用Vixie cron common:
@reboot /path/to/wrapperscript
有关如何使用cron和@reboot标签的更多详细信息,请访问mancrontab和man5crontab。如果您确实觉得需要对ps的输出进行grep,请小心grep本身
[ghoti@pc ~]$ sleep 60 &
[1] 66677
[ghoti@pc ~]$ ps aux | grep sleep
ghoti 66677 0.0 0.0 3928 784 11 S 4:11PM 0:00.00 sleep 60
ghoti 66681 0.0 0.0 16440 1348 11 S+ 4:12PM 0:00.00 grep sleep
[ghoti@pc ~]$
有一种简单的方法可以避免这种情况。只需将grep的一部分转换为更复杂的正则表达式
[ghoti@pc ~]$ sleep 60 &
[2] 66717
[ghoti@pc ~]$ ps aux | grep '[s]leep'
ghoti 66677 0.0 0.0 3928 784 11 S 4:11PM 0:00.00 sleep 60
ghoti 66717 0.0 0.0 3928 784 11 S 4:13PM 0:00.00 sleep 60
[ghoti@pc ~]$
另一方面,如果您只是想确保您的PHP脚本始终运行,那么可以将它包装成某种东西,在它死后重新运行:
while true; do
php /path/to/my.php
done
如果希望在启动时运行此功能,可以在服务器上编辑crontab,并使用@reboot标记,假设您在Linux和BSD上使用Vixie cron common:
@reboot /path/to/wrapperscript
有关如何使用cron和@reboot标记的更多详细信息,请访问mancrontab和man5crontab。T表示有人向它发送了一个-STOP信号-这通常是故意的:脚本在后台挂起,或者正在调试。发生这种情况时,您不希望启动第二个进程,因为脚本可能会在一瞬间继续。这并不意味着有人向它发送了一个停止信号——这通常是故意的:脚本挂起在后台,或者正在调试。发生这种情况时,您不想再启动第二个进程,因为脚本可能会在一瞬间继续。如果您的系统有pgrep,那么使用起来就容易多了。如果您的系统有pgrep,那么使用起来就容易多了。我不知道您使用的是什么操作系统,但在我的系统中,-C是通过使用忽略驻留时间的原始CPU计算来更改CPU百分比的计算方式。如果OP的问题是关于PHP和Shell的,那么从PHP和Shell的角度回答这个问题,而不是你对其他命令的特殊偏好。我使用的是Linux,ps的主页上说这个ps符合:1单一Unix规范的第2版,2开放组技术标准基本规范,第6期,3 IEEE Std 1003.1,2004版,4X/开放系统接口扩展[UP XSI],5ISO/IEC 9945:2003-我想这就足够了。从这个问题中我们所知道的是OP的操作系统使用Berkeley风格的ps选项,而不是SystemV选项。你是对的。我不再强调Linux风格的ps部分,而是更多地关注bash部分。谢谢。我不知道你使用的是什么操作系统,但在我的操作系统中,-C是通过使用忽略驻留时间的原始CPU计算来改变CPU百分比的计算方式。如果OP的q
uestion是关于PHP和Shell的,从PHP和Shell的角度回答这个问题,而不是你对其他命令的特殊爱好。我使用的是Linux,ps的主页上说这个ps符合:1单一Unix规范的第2版,2开放组技术标准基本规范,第6期,3 IEEE Std 1003.1,2004版,4 X/开放系统接口扩展[UP XSI],5 ISO/IEC 9945:2003-我认为这就足够了。从这个问题中我们所知道的是OP的操作系统使用Berkeley风格的ps选项,而不是SystemV选项。你说得对。我不再强调Linux风格的ps部分,而是更多地关注bash部分。谢谢