Linux 如何从一个bash脚本启动另一个bash脚本

Linux 如何从一个bash脚本启动另一个bash脚本,linux,bash,shell,cron,command-line-interface,Linux,Bash,Shell,Cron,Command Line Interface,我试图在Centos 7上运行一个长期运行的php cli进程,但收效甚微。 因此,我求助于几个bash脚本——一个用于启动流程,另一个用于检查流程是否正在运行,如果没有,则重新启动流程。cron每两分钟触发一次重启脚本 这是我的cron条目 */2****bash/var/www/html/production/start\u process.sh 这是我的两个脚本 启动流程。sh #!/bin/bash if ps -f | grep -q "[p]rocess_queue" ; then

我试图在Centos 7上运行一个长期运行的php cli进程,但收效甚微。 因此,我求助于几个bash脚本——一个用于启动流程,另一个用于检查流程是否正在运行,如果没有,则重新启动流程。cron每两分钟触发一次重启脚本

这是我的cron条目

*/2****bash/var/www/html/production/start\u process.sh

这是我的两个脚本

启动流程。sh

#!/bin/bash
if ps -f | grep -q "[p]rocess_queue" ; then echo "Message queue process is already running" ; else bash /var/www/html/production/process_message_queue.sh; fi
#!/bin/bash
echo "Starting process message queue"
nohup php /var/www/html/production/index.php messages process_queue > process_message_queue.out 2> process_message_queue.err < /dev/null &
echo "Started process message queue"
处理消息队列。sh

#!/bin/bash
if ps -f | grep -q "[p]rocess_queue" ; then echo "Message queue process is already running" ; else bash /var/www/html/production/process_message_queue.sh; fi
#!/bin/bash
echo "Starting process message queue"
nohup php /var/www/html/production/index.php messages process_queue > process_message_queue.out 2> process_message_queue.err < /dev/null &
echo "Started process message queue"
#/bin/bash
回显“启动进程消息队列”
nohup php/var/www/html/production/index.php messages process_queue>process_message_queue.out 2>process_message_queue.err
当通过终端运行时,每个脚本的行为都符合预期

bash start\u process.sh
将返回进程正在运行的消息,或启动第二个脚本,该脚本将正确启动PHP进程

但是,当从cron运行时,第一个脚本将启动,并触发第二个脚本。我知道这一点,因为这两条回显语句出现在/var/spool/mail/root中。 但是如果我在cron作业触发后执行ps-f,进程就不存在了


我有指向每个shell脚本的完整路径,cron是root,每个shell脚本都是root所有。

除了用PHP命令解决根本问题(以及它崩溃的原因),我建议将此行为包装为服务,而不是cron作业。这还有一个额外的好处,即故障时立即重新启动(与cron相反,cron需要等到下一分钟)。例如,如果您正在使用systemd,则可以添加以下服务(
/etc/systemd/system/charliefortune.service
):

并将
处理消息队列.sh
更改为:

#!/bin/bash
echo "Starting process message queue"
php /var/www/html/production/index.php messages process_queue > process_message_queue.out 2> process_message_queue.err  # This blocks
echo "Started process message queue"
您还可以在服务管理器中获得一些不错的日志输出


我意识到这更多的是一个评论,而不是一个答案,但我缺乏对你的问题发表评论的声誉。

你希望在这个过程中看到shell脚本吗?一旦执行了命令,它将关闭脚本/shell,除非它是一个活动进程)。我希望看到php脚本-这是一个永久循环,我没有中断并发送到后台。
process\u message\u queue.out/err
文件中有任何内容吗?一个简单的解释是,php生成的进程几乎立即退出,因为出现了一个错误,例如,如果它依赖的环境变量不是在cronjobno上下文中设置的,那么它们是空的,这也是令人费解的。我以前确实因为缺少globals而出现了env错误,但是解决了这些错误,这可以通过终端执行两个shell脚本来证明(我相信),并且进程保持在后台运行。您不能在其中放入一些调试语句吗?e、 g.echo
date
/tmp/start.txt等,并查看它实际到达的位置?从shell运行它并不一定意味着它与cron相同——例如,如果从cron运行,您可能需要cd到dir/use完整路径(而shell将保留它们)。你说你确定它正在运行,但我认为情况可能并非如此。也许在php调用之前和之后放一些步骤,不要通过nohup运行——例如,为什么不只是后台处理呢?或者将进程日志重定向到另一个文件进行调试?这很好,谢谢。我意识到我的方法是有缺陷的,我是出于解决问题的绝望才找到这个解决方案的,真的。