使用 nohup 使脚本无限期运行

使用 nohup 使脚本无限期运行

我对它很陌生,Linux而且我只将它用于SSH我的网络服务器Putty。我遇到的问题是这样的:

基本上我有2个php脚本。一个人get_tweets.php不断地在 Twitter 上监听推文,Streaming API而另一个人parse_tweets.php则将这些推文记录到db.为了让它们发挥作用,它们必须保持持续运行。

我一直在使用以下命令在后台运行它们,从我所看到的来看,它们在一天的大部分时间里都在运行,但是每当我早上登录到我的计算机时,它们scripts就会停止,我必须运行命令再次。

nohup php my_script.php > /dev/null &

我只是想知道根据我正在使用的命令这是否正常,它们在使用时是否应该无限期运行nohup,如果不是,还有什么替代方案?一份CRON工作?

谢谢您的帮助

答案1

同时nohup您还必须重定向错误。下一个命令运行脚本,并将输出和错误重定向到 /dev/null:

nohup php my_script.php >/dev/null 2>&1 &

但是您的脚本可能会因其他原因而终止(脚本错误、oom-killer 等)。因此,您应该通过系统的 init 对其进行守护进程(如果它支持自动重启 - upstart、systemd 和其他一些可以做到)。或者你应该编写 cron 任务来检查并重新启动你的脚本(如果它没有运行)。

答案2

也许您想看看发生了什么,而不是将输出重定向到/dev/null.

我建议您打开screentmux会话。两者都是终端多路复用器,即使您注销,它也会保持活动状态。

例如,(..)获取信息

$ screen
$(inside screen-t1): ./get_tweets.php
.... running first

现在Ctrl-a c按 打开一个新终端。

 $(inside screen-t2): ./parse_tweets.php
 ... running second

Ctrl-a d让您分离会话。当您重新登录时,使用screen -r

注意:您可以在屏幕中显示状态栏以可视化不同的窗口。

答案3

如果您只是想确保脚本在终止时重新启动,您可以执行类似的操作while true ; do php my_script.php ; done > /dev/null

这将等待 my_script.php 完成运行,然后再次运行它。所有输出将发送到 /dev/null

如果你想使用nohup,那么你应该执行以下操作

$ echo 'while true ; do php my_script.php ; done > /dev/null' > ~/php_run_loop.sh
$ chmod a+x ~/php_run_loop.sh
$ nohup ~/php_run_loop.sh

注意:如果您的 php 脚本中有错误或其他问题,这将导致它无限制地一遍又一遍地运行。这不是一个优雅的解决方案,但它是一个解决方案。

顺便说一句,cron 适合按计划运行一个短暂的进程(每 5 分钟或每周等),它不知道如何保持现有进程运行。

相关内容