千家信息网

linux如何实现监控程序和程序自动重启方法

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编给大家分享一下linux如何实现监控程序和程序自动重启方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用脚本实现自
千家信息网最后更新 2026年10月31日linux如何实现监控程序和程序自动重启方法

小编给大家分享一下linux如何实现监控程序和程序自动重启方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

使用脚本实现自动重启

首先想到的最简单的使用shell脚本,大概思路:

ps -ef | grep "$1″ | grep -v "grep" | wc -l 是获取 $1 ($1 代表进程的名字)的进程数,脚本根据进程数来决定下一步的操作。通过一个死循环,每隔 1 秒检查一次系统中的指定程序的进程数,这里也可使用crontab来实现。

这种方法比较土,还是可以基本解决问题,但是有1s的延迟,笔者在应用中未采用这种方法,有关这个shell脚本,请参看文章后面的附件代码。

exec+fork方式

笔者最终采用的exec+fork方式来实现的,具体思想如下:

1,exec函数把当前进程替换为一个新的进程,新进程由path或file参数指定。可以使用exec函数将程序的执行从一个程序切换到另一个程序;

2,fork函数是创建一个新的进程,在进程表中创建一个新的表项,而创建者(即父进程)按原来的流程继续执行,子进程执行自己的控制流程;

3,wait 当fork启动一个子进程时,子进程就有了它自己的生命周期并将独立运行,我们可以在父进程中调用wait函数让父进程等待子进程的结束;

相信介绍到这里,读者已经能够想到解决方法了:1)首先使用fork系统调用,创建子进程,2)在子进程中使用exec函数,执行需要自动重启的程序,3) 在父进程中执行wait等待子进程的结束,然后重新创建一个新的子进程。

使用方法:

#./portmap 需要监控的程序的路径#args portmap 需要的参数$ ./supervisor ./portmap  args.....

代码如下:

/** * * supervisor  * * author: liyangguang (liyangguang@software.ict.ac.cn) * * date: 2011-01-21 21:04:01 * * changes * 1, execl to execv */ #include #include #include #include #include #include #include  intmain(int argc, char **argv){int ret, i, status;char *child_argv[100] = {0};pid_t pid;if (argc < 2) {         fprintf(stderr, "Usage:%s  \n", argv[0]);return -1;}for (i = 1; i < argc; ++i) {child_argv[i-1] = (char *)malloc(strlen(argv[i])+1);strncpy(child_argv[i-1], argv[i], strlen(argv[i]));child_argv[i-1][strlen(argv[i])] = '\0';}while(1){         pid = fork(); if (pid == -1) {fprintf(stderr, "fork() error.errno:%d error:%s\n", errno, strerror(errno));break;}if (pid == 0) {ret = execv(child_argv[0], (char **)child_argv);//ret = execl(child_argv[0], "portmap", NULL, 0);if (ret < 0) {fprintf(stderr, "execv ret:%d errno:%d error:%s\n", ret, errno, strerror(errno));continue;}exit(0);} if (pid > 0) {pid = wait(&status);             fprintf(stdout, "wait return");} }  return 0;}

子进程的结束状态返回后存于status,底下有几个宏可判别结束情况
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真

WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。

wait函数返回值总结

shell脚本方式的代码如下:

# 函数: CheckProcess# 功能: 检查一个进程是否存在# 参数: $1 --- 要检查的进程名称# 返回: 如果存在返回0, 否则返回1.#------------------------------------------------------------------------------CheckProcess(){  # 检查输入的参数是否有效  if [ "$1" = "" ];  thenreturn 1  fi   #$PROCESS_NUM获取指定进程名的数目,为1返回0,表示正常,不为1返回1,表示有错误,需要重新启动  PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | wc -l`   if [ $PROCESS_NUM -eq 1 ];  thenreturn 0  elsereturn 1  fi}  # 检查test实例是否已经存在while [ 1 ] ; do CheckProcess "test" CheckQQ_RET=$? if [ $CheckQQ_RET -eq 1 ]; then # 杀死所有test进程,可换任意你需要执行的操作    killall -9 test  exec ./test &   fi sleep 1done

以上是"linux如何实现监控程序和程序自动重启方法"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

进程 程序 函数 方法 代码 脚本 检查 信号 参数 监控 方式 果子 篇文章 先用 监控程序 内容 情况 流程 笔者 系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 花魁咖啡 港股互联网科技股 北京互联网科技 科技创新互联网企业 易通互联网络科技有限公司 广州善班互联网科技 衡水科技产业互联网平台 银川新华互联网科技职业技术培训学校图片 东莞新华互联网科技学校 佛山市翊博互联网络科技有限公司 用友工业互联网科技发展 南博望互联网科技有限公司 启辰互联网科技 中天科技中国工业互联网 广州有谷有贝互联网科技有限公司 互联网科技新闻 山东蛋芒互联网科技有限公司 广东猫王互联网科技有限公司电话 现代科技的标志之一的互联网 朗新科技与工业互联网 互联网科技公司电话 云电互联网科技 广州凡科互联网科技 金融科技和互联网金融 互联网企业和科技型企业 现代互联网科技股 全球顶尖互联网科技公司 广西互联网科技孵化中心 西安小鹰速贷互联网科技有限公司
0