我对它很陌生,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
.
我建议您打开screen
或tmux
会话。两者都是终端多路复用器,即使您注销,它也会保持活动状态。
例如,(..)
获取信息
$ 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 分钟或每周等),它不知道如何保持现有进程运行。