千家信息网

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

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,小编给大家分享一下linux如何实现监控程序和程序自动重启方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用脚本实现自
千家信息网最后更新 2025年12月01日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安全错误 数据库的锁怎样保障安全 公网服务器网络安全防护 百度九一网络技术福州有限公司 xp本地服务器搭建 网络安全法100问 为什么无法连接到服务器 杭州时讯网络技术有限公司 计算机网络技术基础课程 时序数据库实例 周口城尚互联网科技有限公司 成都网络安全产业什么时候推基金 为什么软件开发比后台工资低 冬奥网络安全卫士徐舒扬 神通数据库查询结果不全 分类数据库怎么选 php 省市区数据库 四川服务器续保维护 上海广东网络安全培训十大品牌 软件开发服务审计标准 数据库最小逻辑存储层次 自建网络数据库教程 编程属不属于软件开发 英国制定汽车网络安全标准 静安区个人数据库服务有哪些 学校院系安全网络安全总结 阿里云磁盘数据库恢复 软件开发的经费 来宾有哪些互联网科技公司 计算机软件开发城市排名 vm12虚拟机架设服务器 娄底软件开发培训去哪好
0