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

2024-10-31 08:38:00
admin
原创
41
摘要:问题描述:我正在尝试确保脚本在开发服务器上保持运行。它整理统计数据并提供 Web 服务,因此它应该会持续运行,但每天它会因为未知原因死掉几次。当我们注意到时,我们只需再次启动它,但这很麻烦,有些用户没有权限(或不知道如何启动它)。作为程序员,我愿意花几个小时彻底解决这个问题,但作为忙碌的人,我认为一定有一种简...

问题描述:

我正在尝试确保脚本在开发服务器上保持运行。它整理统计数据并提供 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-failureon-abnormalon-watchdogon-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 的示例中,只需将变量的值替换为processmakerun的进程。

  • 创建如下 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:

一个好的、简单的方法如下:

  1. 如果服务器无法监听其期望的端口,则让它死机

  2. 设置一个 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用