回顾历史
依稀记得大一时看过一部黑客小说,其中有个细节给我的印象颇深:比赛作品中有个计算机扫描软件,主人公大黑客说,对大学生来说其中的技术含量很高,其需要对计算机有一个很好的认识。对当年电脑小白的我来说,那只是给我提了个醒,以后要留意这方面的信息,先把大概的思路理清楚。
程序来源
实验室各种网络环境基本已经搭建完毕,我们都是在各自的电脑上通过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自带的有两种工具可以实现脱离终端运行程序:
nohub命令:其将标准输出重定向到当前目录下的nohub.out文件中,指令格式如下:
nohub 命令 //当前终端不能再执行其他指令,可以关闭终端
nohub 命令& //可以直接按enter
键回到终端命令模式执行其他指令tmux工具:可能是谁写的一个工具,常见的命令如下:
标准终端下下:
tmux //新建一个tmux终端
tmux ls //显示已经存在的tmux终端
tmux attach-session -t 窗口号 //打开之前创建的tmux终端
tmux终端下:
Ctrl-b再按d //该tmux终端隐藏运行
Ctrl-d //直接退出tmux终端
exit //同上
标准中下其他指令