linux监控程序-程序自动重启实现方法

如果是简单的手机重启我们可如下操作

----Linux 重启命令----

1、shutdown
2、poweroff
3、init
4、reboot
5、halt

这里我们就不介绍了,因为我主要是讲自动重启实现方法

使用脚本实现自动重启

首先想到的最简单的使用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 <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
 
int
main(int argc, char **argv)
{
    int ret, i, status;
    char *child_argv[100] = {0};
    pid_t pid;
    if (argc < 2) {
 
        fprintf(stderr, "Usage:%s <exe_path> <args...>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])] = '';
    }
    while(1){
 
        pid = fork();
        if (pid == -1) {
            fprintf(stderr, "fork() error.errno:%d error:%sn", 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:%sn", ret, errno, strerror(errno));
                continue;
            }
            exit(0);
        }
 
        if (pid > 0) {
            pid = wait(&status);
 
            fprintf(stdout, "wait return");
        }
 
    }
 
 
    return 0;
}

shell脚本方式的代码如下:

 代码如下 复制代码

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

时间: 2024-10-30 13:44:01

linux监控程序-程序自动重启实现方法的相关文章

win8系统如何在U盘弹出后自动重启的方法

  U盘的用户估计是所有人都知道的,以其轻巧.便捷的身形获取了不少人的青睐,相比于硬盘,U盘的使用度明显提高不少,但是因为其便利性,也会有它的缺憾,比如说U盘很不稳定,经常会遇到插到电脑中没有反应的现象.今天就有一位用户来和小编反映说,他刚把U盘插入win8的电脑中,一切按照正常的步骤拔出,但想要再次插入电脑连接的时候却没有任何的反应,这是什么原因呢?下面小编教大家win8系统中如何才能使U盘弹出后重新启用的方法. win8系统在U盘弹出后自动重启的方法 第一步:首先我们需要将返回到win8系统

Linux 守护进程 自动重启 shell 脚本分享

#!/bin/sh #本脚本为守护进程, 如果发现进程僵死时, 自动重启进程   function check_and_kill_and_start(){ log_file=$1 ps_name=$2 dead_duration=$3 # echo "check the progress "$ps_name ymd=$(date +%Y-%m-%d) log_file=${log_file}${ymd}.log # echo $log_file 判断是否存在log_file if [ 

linux下oracle数据库重启的方法

网站的服务中断了,重启下发现是oralce服务不存在,又不想重启机器,就重新启动下oralce,再重启服务,搞定. 操作的为oracle9i:(其他应该也可以用吧记录如下)声明:坚挺器(应该理解的哦,信息发不出去,你懂的,就用这个了) (1) 以oracle身份登录数据库,命令:su – oracle (2) 进入Sqlplus控制台,命令:sqlplus /nolog (3) 以系统管理员登录,命令:connect / as sysdba (4) 启动数据库,命令:startup (5) 如果

Linux下crontab(自动重启)的格式备忘

1.直接用crontab命令编辑 cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明: 引用: crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出某个用户cron服务的详细内容 crontab -r //删除没个用户的cron服务 crontab -e //编辑某个用户的cron服务 比如说root查看自己的cron设置: 引用: crontab -u root -l 再例如,r

tomcat在windows下设置自动重启的方法

绿色版tomcat在windows下设置自动重启 首先下载tomcat,一定要下载有bin\service.bat文件的,并且要有tomcat.exe文件 首先是tomcat在F:\apache-tomcat-6.0.36\bin中的startup.bat能够自动启动,启动需要配置两个环境变量. a)AVA_HOME:F:\cds\jdk1.5.0_09(jdk位置) b)CATALINA_HOME:F:\cds\apache-tomcat-6.0.36(tomcat的位置,startup是启动

windows控制台程序自动重启

有时控制台程序由于日志更改或其他原因需要定时重启,在Linux平台有很多工具可以实现,但是windows命令有限,实现起来有些麻烦.最近有个项目需要处理这种情况,搜索了很久,并写了一些代码才解决.程序为java编写,要重启需要解决两个问题--杀掉java进程和重启启动程序.这里还有一个隐含的问题,如果杀掉进程后马上启动新的程序,有的时候会出现两个后果交叉的情况,虽然程序是先调用了杀进程再启动,但是启动的进程又被杀掉了.为了避免这种情况出现,在两个操作之间需要延时一会.这样,问题就归结为:1 杀掉

让Win8系统补丁安装完成后自动重启的方法

使用Win8系统的朋友不知道有没注意到,每当Win8更新补丁时,在它自动安装完成后都不会弹出立即重启的请求,而是在登录画面告诉你3天后重启,以完成重要更新的安装.这样通常会导致补丁安装滞后,或许当你注意到文字提示的时候,补丁都已经发布好几天,那么我们该如何让Win8补丁一更新完毕就立即重启呢?今天就来把这项小技巧传授给大家. 如果你用的是台式机,在关机时候还能看到"更新并重启"的提示,若是笔记本用户,平时又不怎么关机(直接合上屏幕让系统休眠待机)的话,就更不容易及时重启更新补丁了.所以

Linux中Tomcat 自动设置CATALINA_HOME方法

在服务器部署中,我们经常会出现"在一个服务器上运行多个tomcat服务"的情况. 使用如下方法设置,可以无限复制平移扩展Tomcat,无需修改其他任何环境变量配置.(当然在同一个机器上复制Tomcat 后,端口还是需要修改的 ^_^) 查看 Tomcat  bin 目录下的 catalina.sh 文件,会发现,它会判断 bin 目录下是否有 setenv.sh 文件,如果存在,会先执行. 按其中英文的解读说明的意思大概是:我们可以使用这个文件来动态设置运行时环境变量. 所以,我们在

笔记本win7系统利用自带防火墙禁止程序自动联网的方法

  1.首先打开控制面板,找到并点击系统与安全; 2.然在弹出来的界面中,点击左侧的"高级设置"选项,然后就会出现高级安全windows防火墙设置. 3.接着点击左侧的"出站规则"项; 4.接着在弹出来的对话框中,点击"新建规则"项; 5.在弹出来的界面中,选中程序; 6.然后点击"浏览"按钮; 7.然后比如你要禁用搜狐这个程序,就在里面找到搜狐的程序,然后选择阻止连接,然后点击下一步; 8.在弹出来的界面中将下面三个选项全部