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

2024-10-31 08:38:00
admin
原创
190
摘要:问题描述:我正在尝试确保脚本在开发服务器上保持运行。它整理统计数据并提供 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用