后台进程监控软件

回顾历史

依稀记得大一时看过一部黑客小说,其中有个细节给我的印象颇深:比赛作品中有个计算机扫描软件,主人公大黑客说,对大学生来说其中的技术含量很高,其需要对计算机有一个很好的认识。对当年电脑小白的我来说,那只是给我提了个醒,以后要留意这方面的信息,先把大概的思路理清楚。

程序来源

实验室各种网络环境基本已经搭建完毕,我们都是在各自的电脑上通过ssh服务远程登陆到四台主机,但我们还是一个问题:通常我们要跑的程序时间都比较长(三四天),如果我们通过远程连接软件在主机中启动程序,一旦关闭远程连接软件,相应的程序也会自动关闭,达不到在服务器上跑程序的目的,问题出来了,就要着手解决啊,所以我就写了个deamon程序来达到这个目的。

写出来之后发现这就是个对程序进行监控的程序啊,只要能够获得程序运行时的状态就可以随意进行程序控制。其实这个程序可以干更多的事情,你可以想象驻留内存有多么大的优势存在。

具体程序

这里是用启动teamviewer作为一个示例,想要启动其他程序可以直接修改system中的参数,或者给该程序一个参数,再者就是让其调用一个shell脚本,然后在shell脚本中写入你想做的事情。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>

#include <time.h>

#define MAXFILE        65535

#define    APP_START    0
#define APP_END        1

volatile sig_atomic_t _running = 1;
int write_log(int log_id);

int main(int argc, char* argv[])
{
    pid_t pc,pid;        //创建两个进程的pid变量
    int i;
    pc = fork(); //第一步,创建子进程

    if(pc<0)
    {
        printf("error fork\n");
        exit(1);
    }
    else if(pc>0)
        exit(0);

    pid = setsid(); //第二步[1],创建一个新的会话,1)让进程摆脱原会话的控制;2)让进程摆脱原进程组的控制;3)让进程摆脱控制终端的控制

    if (pid < 0)
        perror("setsid error");
    chdir("/"); //第三步
    umask(0); //第四步,收回父进程资源
    for(i=0;i<MAXFILE;i++) //第五步
        close(i);

    while( _running )
    {    

        write_log(APP_START);
        system("teamviewer");
        write_log(APP_END);

        _running = 0;
        usleep(10*1000); //10毫秒
        usleep(1000*1000); //1秒
    }
    return 0;
}

int write_log(int log_id)
{
    char* buf;
    time_t rawtime;
    struct tm * timeinfo;
    int len,fd;

    if( (fd=open("home/lab302/yanan/bin/log/teamviewer.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)
    {
        perror("open");
        exit(1);
    }
    time( &rawtime );
    timeinfo = localtime ( &rawtime );
    buf = asctime(timeinfo);
    len = strlen(buf);
    write(fd,buf,len);

    if(APP_START == log_id)
    {
        buf = "        teamviewer started!\n";
    }else{
        buf = "        teamviewer closed!\n";
    }

    len = strlen(buf);
    write(fd,buf,len);
    close(fd);
    return 0;
}

2015-8-3更新

现在发现linux自带的有两种工具可以实现脱离终端运行程序:

  1. nohub命令:其将标准输出重定向到当前目录下的nohub.out文件中,指令格式如下:

    nohub 命令 //当前终端不能再执行其他指令,可以关闭终端
    nohub 命令& //可以直接按enter键回到终端命令模式执行其他指令

  2. tmux工具:可能是谁写的一个工具,常见的命令如下:

标准终端下下:

tmux    //新建一个tmux终端
tmux ls    //显示已经存在的tmux终端
tmux attach-session -t 窗口号    //打开之前创建的tmux终端

tmux终端下:

Ctrl-b再按d        //该tmux终端隐藏运行
Ctrl-d            //直接退出tmux终端
exit            //同上
标准中下其他指令