Linux 脚本用于检查进程是否正在运行并根据结果采取行动

2024-10-30 08:36:00
admin
原创
237
摘要:问题描述:我有一个经常失败且有时会启动重复实例的过程。当我运行时:ps x |grep -v grep |grep -c "processname"我会得到:2这是正常的,因为该过程与恢复过程一起运行。如果我得到:0我将要启动该过程;如果我得到:4我将要停止并重新启动该过程...

问题描述:

我有一个经常失败且有时会启动重复实例的过程。

当我运行时:
ps x |grep -v grep |grep -c "processname"
我会得到:
2
这是正常的,因为该过程与恢复过程一起运行。

如果我得到:
0
我将要启动该过程;如果我得到:
4
我将要停止并重新启动该过程

我需要的是一种获取结果的方法ps x |grep -v grep |grep -c "processname"

然后设置一个简单的 3 选项功能

ps x |grep -v grep |grep -c "processname"
if answer = 0 (start process & write NOK & Time to log /var/processlog/check)
if answer = 2 (Do nothing & write OK & time to log /var/processlog/check)
if answer = 4 (stot & restart the process & write NOK & Time to log /var/processlog/check)

进程停止于:
killall -9 process
进程启动于:
process -b -c /usr/local/etc

我的主要问题是找到一种方法来根据结果采取行动ps x |grep -v grep |grep -c "processname"

理想情况下,我想将 grep 的结果作为脚本中的变量,如下所示:

process=$(ps x |grep -v grep |grep -c "processname")

如果可能的话。


解决方案 1:

监视系统上某个进程是否正在运行的程序。

脚本存储在crontab并且每分钟运行一次。

如果进程未运行或进程多次运行,则此方法有效:

#! /bin/bash

case "$(pidof amadeus.x86 | wc -l)" in

0)  echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt
    /etc/amadeus/amadeus.x86 &
    ;;
1)  # all ok
    ;;
*)  echo "Removed double Amadeus: $(date)" >> /var/log/amadeus.txt
    kill $(pidof amadeus.x86 | awk '{print $1}')
    ;;
esac

0如果找不到进程,则重新启动它。

1如果找到了进程,则一切正常。

*如果正在运行 2 个或更多进程,则终止最后一个。


更简单的版本。这只是测试进程是否正在运行,如果没有,则重新启动它。

$?它只是测试程序的退出标志pidof。如果0进程正在运行,1则退出。

#!/bin/bash
pidof  amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
        echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt
        /etc/amadeus/amadeus.x86 &
fi

最后,一句台词

pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &

然后可以在 crontab 中使用它每分钟运行一次,如下所示:

* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &

cccam oscam

解决方案 2:

我采用了 @Jotne 的解决方案,效果非常好!例如,我的 NAS 中的 mongodb 服务器

#! /bin/bash

case "$(pidof mongod | wc -w)" in

0)  echo "Restarting mongod:"
    mongod --config mongodb.conf
    ;;
1)  echo "mongod already running"
    ;;
esac

解决方案 3:

我已根据我的情况采用了你的脚本。Jotne。

#! /bin/bash

logfile="/var/oscamlog/oscam1check.log"

case "$(pidof oscam1 | wc -w)" in

0)  echo "oscam1 not running, restarting oscam1:     $(date)" >> $logfile
    /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 &
    ;;
2)  echo "oscam1 running, all OK:     $(date)" >> $logfile
    ;;
*)  echo "multiple instances of oscam1 running. Stopping & restarting oscam1:     $(date)" >> $logfile
    kill $(pidof oscam1 | awk '{print $1}')
    ;;
esac

我在测试时遇到了一个问题...我用这行代码启动了 oscam1 的 3 个额外进程:
/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
这使 oscam1 剩下 8 个进程。问题是这样的...当我运行脚本时,它每次只会终止 2 个进程,所以我必须运行它 3 次才能将其减少到 2 个进程...

除了后面killall -9 oscam1跟上之外/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1*)除了原始进程之外,还有其他更好的 killall 方法吗?这样就不会有停机时间了?

解决方案 4:

如果您将 awk '{print $1}' 更改为 '{ $1=""; print $0}',结果将得到除第一个之外的所有进程。它将以字段分隔符(通常为空格)开头,但我不记得 killall 关心这一点。因此:

#! /bin/bash

logfile="/var/oscamlog/oscam1check.log"

case "$(pidof oscam1 | wc -w)" in

0)  echo "oscam1 not running, restarting oscam1:     $(date)" >> $logfile
    /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 &
    ;;
2)  echo "oscam1 running, all OK:     $(date)" >> $logfile
    ;;
*)  echo "multiple instances of oscam1 running. Stopping & restarting oscam1:     $(date)" >> $logfile
    kill $(pidof oscam1 | awk '{ $1=""; print $0}')
    ;;
esac

值得注意的是,pidof 路由似乎对没有空格的命令工作得很好,但是如果你正在寻找一个名为 myscript 的 python 脚本,并且它出现在 ps 下,那么你可能想要回到基于 ps 的字符串,就像

root 22415 54.0 0.4 89116 79076 pts/1 S 16:40 0:00 /usr/bin/python /usr/bin/myscript

仅供参考

解决方案 5:

“pidof”命令不会显示 shell/perl/python 脚本的 pid。因此,要找到我的 Perl 脚本的进程 ID,我必须使用 -x 选项,即“pidof -x perlscriptname”

解决方案 6:

我根本无法让案例发挥作用。以下是我所拥有的:

#! /bin/bash

logfile="/home/name/public_html/cgi-bin/check.log"

case "$(pidof -x script.pl | wc -w)" in

0)  echo "script not running, Restarting script:     $(date)" >> $logfile
#  ./restart-script.sh
;;
1)  echo "script Running:     $(date)" >> $logfile
;;
*)  echo "Removed duplicate instances of script: $(date)" >> $logfile
 #   kill $(pidof -x ./script.pl | awk '{ $1=""; print $0}')
;;
esac

现在,rem case 动作命令仅用于测试脚本。上面的 pidof -x 命令返回“1”,case 语句返回的结果为“0”。

有人知道我哪里做错了吗?

通过将以下内容添加到我的 BIN/BASH 脚本来解决这个问题:PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

解决方案 7:

如果您正在寻找一种更现代的方式来检查服务是否正在运行(这对任何旧进程都不起作用),那么systemctl可能就是您要找的。

这是基本命令:

systemctl show --property=ActiveState your_service_here

这将产生非常简单的输出(根据服务是否正在运行,将出现以下两行之一):

ActiveState=active
ActiveState=inactive

如果您想了解您可以获得的所有属性:

systemctl show --all your_service_here

如果您喜欢按字母顺序排列:

systemctl show --all your_service_here | sort

执行该操作的完整代码如下:

service=$1
result=`systemctl show --property=ActiveState $service`
if [[ "$result" == 'ActiveState=active' ]]; then
    echo "$service is running" # Do something here
else
    echo "$service is not running" # Do something else here
fi 

解决方案 8:

如果您使用的是 CentOS,则无需编写脚本并设置 cron 作业。这是确保 systemd 服务在失败时重新启动的最聪明的方法之一。对 /usr/lib/systemd/system/mariadb.service 进行以下更改

然后在文件的[Service]部分下添加以下两行:

Restart=always
RestartSec=3

保存文件后,我们需要重新加载守护进程配置,以确保 systemd 知道新文件

systemctl daemon-reload

阅读以下链接了解完整步骤 -
https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用