我正在尝试确保脚本仍在开发服务器上运行.它整理统计数据并提供一个网络服务,因此它应该持续存在,但是每天几次,它会因为未知原因而消失.当我们注意到我们只是再次启动它时,但后面是一个痛苦,一些用户没有权限(或技术诀窍)启动它.
我的程序员想要花几个小时来解决问题的根源但是我这个忙碌的人认为必须有一种简单的方法来检测应用程序是否没有运行,然后重新启动它.
我知道我可以通过grep cron-script ps:
ps -A | grep appname
但同样,这是我生命中的另一个小时浪费在做一些必须已经存在的事情上......是否有一个预先制作的应用程序,我可以传递一个可执行文件(可选择带参数),这将使进程无限期地运行?
如果它有任何区别,那就是Ubuntu.
我在cron中使用了一个简单的脚本来确保程序正在运行.如果不是,那么它将启动它.这可能不是您正在寻找的完美解决方案,但它很简单且效果很好.
#!/bin/bash
#make-run.sh
#make sure a process is always running.
export DISPLAY=:0 #needed if you are running a simple gui app.
process=YourProcessName
makerun="/usr/bin/program"
if ps ax | grep -v grep | grep $process > /dev/null
then
exit
else
$makerun &
fi
exit
然后每分钟或每5分钟添加一个cron作业.
Monit非常适合这个:)
您可以编写简单的配置文件,告诉monit观看例如TCP端口,PID文件等
当监视的进程不可用/使用太多内存/将CPU挂起太久/等时,monit将运行您指定的命令.它还会弹出一个电子邮件提醒,告诉您发生了什么以及它是否可以采取任何措施.
我们使用它来保持我们网站的负载运行,同时在出现问题时给予我们预警.
- 你的忠实员工,Monit
由于您使用的是Ubuntu,因此您可能对Upstart感兴趣,它已经取代了传统的sysV init.一个关键功能是,如果服务意外死亡,它可以重新启动服务.Fedora已经进入新贵阶段,而Debian正处于试验阶段,因此值得深入研究.
但这对于这种情况可能有点过头了,因为cron脚本需要2分钟才能实现.
#!/bin/bash if [[ ! `pidof -s yourapp` ]]; then invoke-rc.d yourapp start fi
如果您使用的是基于systemd的发行版(如Fedora)和最近的Ubuntu发行版,则可以使用systemd的"重新启动"功能进行服务.如果需要由特定用户管理和运行,它可以设置为系统服务或用户服务,这在OP的特定情况下更可能发生.
重新启动选项需要之一 no
,on-success
,on-failure
,on-abnormal
,on-watchdog
,on-abort
,或always
.
要以用户身份运行它,只需将以下文件放入~/.config/systemd/user/something.service
:
[Unit] Description=Something [Service] ExecStart=/path/to/something Restart=on-failure [Install] WantedBy=graphical.target
然后:
systemctl --user daemon-reload systemctl --user [status|start|stop|restart] something
无需root权限/修改系统文件,无需cron作业,无需安装,灵活如地狱(请参阅文档中的所有相关服务选项).
有关使用每用户systemd实例的更多信息,另请参阅https://wiki.archlinux.org/index.php/Systemd/User.
我用过cron"killall -0 programname || /etc/init.d/programname start".如果进程不存在,kill将出错.如果它确实存在,它将向进程传递一个空信号(内核将忽略并且不会打扰传递.)
这个成语很容易记住(恕我直言).通常我会使用它,而我仍在尝试发现服务本身失败的原因.恕我直言,一个程序不应该只是意外消失:)
把你的跑步放在一个循环中 - 所以当它退出时,它再次运行......而(真){运行我的应用..}