如何确保应用程序在 Linux 上持续运行
- 2024-10-31 08:38:00
- admin 原创
- 41
问题描述:
我正在尝试确保脚本在开发服务器上保持运行。它整理统计数据并提供 Web 服务,因此它应该会持续运行,但每天它会因为未知原因死掉几次。当我们注意到时,我们只需再次启动它,但这很麻烦,有些用户没有权限(或不知道如何启动它)。
作为程序员,我愿意花几个小时彻底解决这个问题,但作为忙碌的人,我认为一定有一种简单的方法来检测应用程序是否未运行,并重新启动它。
我知道我可以通过 grep 来编写 cron 脚本 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 作业。
解决方案 2:
Monit非常适合这个:)
你可以编写简单的配置文件来告诉 monit 监视 TCP 端口、PID 文件等
当监控的进程不可用/占用过多内存/占用 CPU 时间过长等情况发生时,monit 将运行您指定的命令。它还会弹出电子邮件警报,告诉您发生了什么以及是否可以采取任何措施。
我们使用它来维持网站的正常运行,同时在出现问题时提前发出警告。
——您忠实的员工,Monit
解决方案 3:
注意:Upstart 处于维护模式,已被使用 systemd 的 Ubuntu放弃。有关如何编写服务定义的详细信息,请参阅 systemd手册。
由于您使用的是 Ubuntu,您可能会对Upstart感兴趣,它取代了传统的sysV init。一个关键特性是,如果服务意外终止,它可以重新启动服务。Fedora 已转向 upstart,而 Debian 处于实验阶段,因此可能值得研究。
但对于这种情况来说这可能有点过度,因为cron脚本需要 2 分钟才能执行。
#!/bin/bash
if [[ ! `pidof -s yourapp` ]]; then
invoke-rc.d yourapp start
fi
解决方案 4:
如果您使用的是基于 systemd 的发行版,例如 Fedora 和最新的 Ubuntu 版本,则可以使用 systemd 的“重启”功能来提供服务。它可以设置为系统服务,也可以设置为用户服务(如果需要由特定用户管理并以特定用户身份运行,在 OP 的特定情况下更可能如此)。
重新启动选项采用、、、、或之一 。no
`on-successon-failure
on-abnormalon-watchdog
on-abort`always
要以用户身份运行它,只需将文件something.service
(根据您的用例适当命名)放入~/.config/systemd/user/
(请注意,路径中的“用户”是文字):
[Unit]
Description=Something
[Service]
ExecStart=/path/to/something
Restart=on-failure
[Install]
WantedBy=graphical.target
然后:
systemctl --user daemon-reload
# to start it automatically on system start
systemctl --user enable something
systemctl --user start something
# other common commands are status, stop, restart, disable
无需 root 权限/修改系统文件、无需 cron 作业、无需安装,非常灵活(请参阅文档中的所有相关服务选项)。
有关使用每个用户 systemd 实例的更多信息,另请参阅https://wiki.archlinux.org/index.php/Systemd/User 。
解决方案 5:
我使用 cron 中的“killall -0 programname || /etc/init.d/programname start”。如果进程不存在,kill 会出错。如果进程存在,它会向进程发送一个空信号(内核会忽略该信号,不会再传递下去)。
这个习语很容易记住(在我看来)。通常,当我仍在尝试找出服务本身失败的原因时,我会使用它。在我看来,程序不应该意外消失 :)
解决方案 6:
将您的运行置于循环中 - 因此当它退出时,它会再次运行... while(true){ 运行我的应用程序.. }
例如,在 bash 中你可以这样做:
while true
do
echo "Hello"
sleep 1
done
只需通过你的错误流程更改 echo+sleep,就像这样
while true
do
/path/to/long-running-process
done
如果你愿意的话,你可以像这样执行while
一行do
代码:
while true; do
/path/to/long-running-process
done
解决方案 7:
由于某种原因,我无法让Chris Wendt解决方案发挥作用,而且很难调试。这个解决方案几乎相同,但更容易调试,将 bash 从模式匹配中排除。要调试,只需运行:bash ./root/makerun-mysql.sh
。在以下使用 mysql-server 的示例中,只需将变量的值替换为process
您makerun
的进程。
创建如下 BASH 脚本(
nano /root/makerun-mysql.sh
):
#!/bin/bash
process="mysql"
makerun="/etc/init.d/mysql restart"
if ps ax | grep -v grep | grep -v bash | grep --quiet $process
then
printf "Process '%s' is running.
" "$process"
exit
else
printf "Starting process '%s' with command '%s'.
" "$process" "$makerun"
$makerun
fi
exit
通过添加适当的文件权限确保它是可执行的(即
chmod 700 /root/makerun-mysql.sh
)然后将其添加到您的 crontab (
crontab -e
):
# Keep processes running every 5 minutes
*/5 * * * * bash /root/makerun-mysql.sh
解决方案 8:
supervise
我更喜欢来自的工具-daemontools
但 Dan J Bernstein 写的所有东西都是我的首选 :)
http://cr.yp.to/daemontools/supervise.html
您必须为应用程序启动脚本创建特定的目录结构,但使用起来非常简单。
解决方案 9:
首先,您如何启动此应用程序?它会自行分叉到后台吗?它是通过 nohup 等启动的吗?如果是后者,请检查它在 nohup.out 中死机的原因,如果是前者,请构建日志记录。
至于您的主要问题:您可以 cron 它,或者在后台运行另一个进程(不是最好的选择)并在 bashscript 中使用 pidof,这很容易:
if [ `pidof -s app` -eq 0 ]; then
nohup app &
fi
解决方案 10:
您可以将其设置为从 inittab 启动的服务(尽管有些 Linux 已在 /etc/event.d 中移至较新的版本)。这些内置系统可确保您的服务持续运行,而无需编写自己的脚本或安装新程序。
解决方案 11:
这是 DMD(守护进程监控守护进程)的工作。周围有几个;但我通常只编写一个脚本来检查守护进程是否正在运行,如果没有运行则运行,然后将其放入 cron 中每分钟运行一次。
解决方案 12:
请参阅《Unix Hater's Handbook》(该书的 PDF 版本来源之一)nanny
第 9 章(第 197 页左右)中引用的“ ” 。
解决方案 13:
一个好的、简单的方法如下:
如果服务器无法监听其期望的端口,则让它死机
设置一个 cronjob,每分钟尝试启动你的服务器
如果未运行,它将启动;如果正在运行,它将不会启动。无论如何,您的服务器将始终处于运行状态。
解决方案 14:
我认为更好的解决方案是也测试该功能。例如,如果您必须测试 Apache,那么仅测试系统上是否存在“Apache”进程是不够的。
如果您想测试 apache 是否 OK,那么请尝试下载一个简单的网页,并测试您的唯一代码是否在输出中。
如果没有,用-9杀死apache然后重新启动。并向根目录发送一封邮件(这是转发到公司/服务器/项目根目录的邮件地址)。
解决方案 15:
它甚至更简单:
#!/bin/bash
export DISPLAY=:0
process=processname
makerun="/usr/bin/processname"
if ! pgrep $process > /dev/null
then
$makerun &
fi
但您必须记住确保进程名称是唯一的。
解决方案 16:
你可以像这样安装逐分钟监控的 cronjob:
crontab -l > crontab;echo -e ' * export DISPLAY=":0.0" && for app in "eiskaltdcpp-qt" "transmission-gtk" "nicotine";do ps aux|grep -v grep|grep "$app";done||"$app" &' >> crontab;crontab crontab
缺点是你输入的应用程序名称必须在ps aux|grep "appname"
输出中找到,并且同时能够使用该名称启动:"appname" &
解决方案 17:
您还可以使用 pm2 库。
sudo apt-get pm2
如果它是节点应用程序则可以安装。
Sudo npm install pm2 -g
他们可以运行该服务。
Linux 服务:
sudo pm2 start [service_name]
npm 服务应用程序:
pm2 start index.js
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件