当前位置:  开发笔记 > 编程语言 > 正文

如何确保应用程序在Linux上继续运行

如何解决《如何确保应用程序在Linux上继续运行》经验,为你挑选了6个好方法。

我正在尝试确保脚本仍在开发服务器上运行.它整理统计数据并提供一个网络服务,因此它应该持续存在,但是每天几次,它会因为未知原因而消失.当我们注意到我们只是再次启动它时,但后面是一个痛苦,一些用户没有权限(或技术诀窍)启动它.

我的程序员想要花几个小时来解决问题的根源但是我这个忙碌的人认为必须有一种简单的方法来检测应用程序是否没有运行,然后重新启动它.

我知道我可以通过grep cron-script ps:

ps -A | grep appname

但同样,这是我生命中的另一个小时浪费在做一些必须已经存在的事情上......是否有一个预先制作的应用程序,我可以传递一个可执行文件(可选择带参数),这将使进程无限期地运行?

如果它有任何区别,那就是Ubuntu.



1> 小智..:

我在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作业.


作为cron单线程,每分钟运行一次:`*****ps aux | grep -v grep | grep -q YourProcessName ||/usr/bin/program&`
那是天才.它将在重新启动后继续存在,无需安装.

2> Gareth..:

Monit非常适合这个:)

您可以编写简单的配置文件,告诉monit观看例如TCP端口,PID文件等

当监视的进程不可用/使用太多内存/将CPU挂起太久/等时,monit将运行您指定的命令.它还会弹出一个电子邮件提醒,告诉您发生了什么以及它是否可以采取任何措施.

我们使用它来保持我们网站的负载运行,同时在出现问题时给予我们预警.

- 你的忠实员工,Monit


你如何让Monit继续运行?

3> JimB..:

由于您使用的是Ubuntu,因此您可能对Upstart感兴趣,它已经取代了传统的sysV init.一个关键功能是,如果服务意外死亡,它可以重新启动服务.Fedora已经进入新贵阶段,而Debian正处于试验阶段,因此值得深入研究.

但这对于这种情况可能有点过头了,因为cron脚本需要2分钟才能实现.

#!/bin/bash
if [[ ! `pidof -s yourapp` ]]; then
    invoke-rc.d yourapp start
fi



4> Raman..:

如果您使用的是基于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.



5> 小智..:

我用过cron"killall -0 programname || /etc/init.d/programname start".如果进程不存在,kill将出错.如果它确实存在,它将向进程传递一个空信号(内核将忽略并且不会打扰传递.)

这个成语很容易记住(恕我直言).通常我会使用它,而我仍在尝试发现服务本身失败的原因.恕我直言,一个程序不应该只是意外消失:)



6> Klathzazt..:

把你的跑步放在一个循环中 - 所以当它退出时,它再次运行......而(真){运行我的应用..}


我与Garath,如果它的系统杀死长时间运行的进程,那么建议的循环 - 将在应用程序之前启动 - 将首先被杀死.
如果脚本因未知原因而死亡,它很可能会取消循环脚本,不是吗?
回答你的两条评论:不,如果脚本因未知原因而死亡,那么循环脚本不受影响,因为它是在一个单独的进程中运行 - 但是,如果系统随机杀死长时间运行的进程,那么这仍然是一个问题 - 但我怀疑是这样的.系统的其余部分未报告为受影响,并且还充满了其他长时间运行的进程,这些进程也将重新启动(仅提到此脚本有问题).
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有