怎么写一个简单的守护进程

作者&投稿:枝彦 (若有异议请与网页底部的电邮联系)
如何给脚本写一个守护进程~

一、背景
项目过程中,经常会有很多的脚本,Shell脚本、PHP脚本、Python脚本等,更有一些脚本是需要常驻内存执行的,简而言之就是需要while(true){}的模式执行。
但是有的时候,一个常驻内存的进程会因为某些耗时操作而夯住,不再往下继续执行,成为了一个僵尸进程;或者因为某个操作偶然出错,直接退出了;所以我们需要有一套简单的机制来保证进程一直处于活跃状态。
二、方案
以一个PHP脚本为例:
脚本中依然采用while(true){}方式,但是额外增加一个执行时间的控制,即,设定当前脚本执行超过某个时间之后,自动退出
脚本自动退出之后,通过一个守护进程自动重启
三、实现
1、PHP脚本范例
脚本名称:script/monitor/Collect.class.php
class Collect extends \Framework\FrameworkScript {

// 表示:脚本最多能活跃10分钟
private $interval = 600;

// 脚本入口
public function run() {

$start = time();
while (true) {
// here , do what you want to do...

// 如果数据为空,则10分钟自杀进程
if (time() - $start > $this->interval) {
exit(0);
}
}
}
}

2、守护进程范例
守护进程脚本名称:script/monitor/Watch.sh
#!/bin/bash
# @author xianliezhao

# crontab命令:
# 监控线上服务稳定性情况
# */1 * * * * sh /home/work/script/monitor/Watch.sh start >> /home/work/logs/script_monitor_watch.log

# PHP命令
php="/home/service/php/bin/php /home/work/mlservice/goods/public/script.php"

# 在这里配置所有需要【守护】的PHP进程
proc_list='monitor\\Collect monitor\\RealtimeAnalytics'

#work 账户运行
name=$(whoami)
if [ $name != 'work' ];then
echo `date "+%Y/%m/%d %H:%M:%S> "` "必须用work账户"
exit
fi

#开启服务
start() {
for proc in $proc_list ;do
arrm=$(ps -ef | grep "`echo $proc`" | grep -v 'grep' | awk -F'script.php' '{print $2}'| wc -l)
if [ ${arrm:-0} = 0 ];then
$php $(echo $proc | awk -F"\\" '{print $1"\\"$3}') >/dev/null &
echo `date "+%Y/%m/%d %H:%M:%S> "` "$proc 进程已经重启"
else
echo `date "+%Y/%m/%d %H:%M:%S> "` "$proc 进程已经存在"
fi
done
}

#停止服务
stop() {
for proc in $proc_list ;do
arrproc=$(ps -ef | grep "`echo $proc`" | awk '{print $2}')
for p in $arrproc; do
kill $p;
echo `date "+%Y/%m/%d %H:%M:%S> "` $p " 进程已杀死!"
done
done
echo `date "+%Y/%m/%d %H:%M:%S> "` "服务已停止!"
}

#check脚本是否运行
check() {
for proc in $proc_list ;do
arrspar=$(ps -ef | grep "`echo $proc`" | grep -v 'grep' | awk '{print $2}')
echo `date "+%Y/%m/%d %H:%M:%S> "` "目前运行的服务监控进程($proc):" ${arrspar:-"无"}
done
}

usage() {
cat <<EOF
守护进程使用方法(需要 work 用户执行):

usage: sh $0 check|start|stop|restart
start 启动服务
stop 停止服务
check 检查服务是否正常
EOF
exit
}

while true;do
case $1 in
start)
start
break
;;
help)
usage
break
;;
stop)
stop
break
;;
check)
check
break
;;
*)
usage
break
;;
esac
shift
done

四、使用
1、使用帮助
[work@script-01 monitor]$ sh Watch.sh
守护进程使用方法(需要 work 用户执行):

usage: sh Watch.sh check|start|stop|restart
start 启动服务
stop 停止服务
check 检查服务是否正常

2、检测脚本执行状态
[work@script-01 monitor]$ sh Watch.sh check
2015/09/24 15:10:48> 目前运行的服务监控进程(monitor\\Collect): 65321
2015/09/24 15:10:48> 目前运行的服务监控进程(monitor\\RealtimeAnalytics): 无

3、通过守护进程手动重启脚本
[work@script-01 monitor]$ sh Watch.sh start
2015/09/24 15:11:26> monitor\\Collect 进程已经重启
2015/09/24 15:11:26> monitor\\RealtimeAnalytics 进程已经重启

4、通过crontab自动守护
# crontab命令:
# 监控线上服务稳定性情况
*/1 * * * * sh /home/work/script/monitor/Watch.sh start >> /home/work/logs/script_monitor_watch.log

每分钟检测一次,没有启动则自动重启!通过这种方式来保证,脚本一定不死。

//根据麦子学院视频改编。。。。 #include #include #include #include #include #include #include int main(int argc,char**argv) { int num=0; //sundy print log char content[128]=""; //1,创建一个子进程,退出父进程 pid_t pid=fork(); if(pid0) { exit(0); } //2,设置新的会话 pid_t ret=setsid(); if(ret0) { sprintf(content, "sundy print log = %d
", num); write(fd,content,strlen(content)); close(fd); } num++; sleep(3); } return 0; }

 守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。unix系统有很多守护进程,大多数服务器都是用守护进程实现的。比如,网络服务inetd、Web服务http等。同时,守护进程完成许多系统任务。比如,作业规划进程crond、打印进程lqd等。这里主要说明守护进程的进程结构,以及如何编写守护进程程序。因为守护进程没有控制终端,所以我们还要介绍在守护进程运行时错误输出的方法。
  守护进程及其特性
  守护进程最重要的特性是后台运行。在这一点上,DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行。总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果大家对进程的认识比较深入,就对守护进程容易理解和编程了。
  首先我们来察看一些常用的系统守护进程,看一下他们和几个概念:进程组、控制终端和对话期有什么联系。p s命令打印系统中各个进程的状态。该命令有多个选择项,有关细节请参考系统手册。为了察看所需的信息,执行:ps –axj
  PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
  0 1 0 0 ? -1 S 0 0:04 init
  1 2 1 1 ? -1 SW 0 0:00 [keventd]
  1 3 1 1 ? -1 SW 0 0:00 [kapm-idled]
  0 4 1 1 ? -1 SWN 0 0:00 [ksoftirqd_CPU0]
  0 5 1 1 ? -1 SW 0 0:00 [kswapd]
  0 6 1 1 ? -1 SW 0 0:00 [kreclaimd]
  0 7 1 1 ? -1 SW 0 0:00 [bdflush]
  0 8 1 1 ? -1 SW 0 0:00 [kupdated]
  1 9 1 1 ? -1 SW< 0 0:00 [mdrecoveryd]
  1 17 1 1 ? -1 SW 0 0:02 [kjournald]
  1 92 1 1 ? -1 SW 0 0:00 [khubd]
  1 573 573 573 ? -1 S 0 0:03 syslogd -r -x
  1 578 578 578 ? -1 S 0 0:00 klogd -2
  1 598 598 598 ? -1 S 32 0:00 portmap
  进程号为1、2的这些进程非常特殊,存在于系统的整个生命期中。它们没有父进程ID ,没有组进程ID ,也没有对话期ID 。syslogd 守护进程可用于任何为操作人员记录系统消息的程序中。可以在一台实际的控制台上打印这些消息,也可将它们写到一个文件中。sendmail 是标准邮递守护进程。update 程序定期将内核缓存中的内容写到硬盘上(通常是每隔30 秒)。为了做到这一点,该程序每隔30 秒调用sync(2 )函数一次。cron 守护进程在指定的日期和时间执行指定的命令。许多系统管理任务是由cron 定期地使相关程序执行而得以实现的。inetd进程监听系统的网络界面,以输入对各种网络服务器的请求。最后一个守护进程,lpd 处理对系统提出的各个打印请求。
  注意,所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端,终端名称设置为问号(?)、终端前台进程组ID设置为-1。缺少控制终端是守护进程调用了setsid的结果。除update以外的所有守护进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。最后,应当引起注意的是所有这些守护进程的父进程都是init进程。
  在接触实际编程前,我们来看看编写守护进程要碰到的概念:进程组合会话期。
  进程组
  每个进程除了有一进程ID之外,还属于一个进程组(在讨论信号时就会涉及进程组)进程组是一个或多个进程的集合。每个进程有一个唯一的进程组ID。进程组ID类似于进程ID——它是一个正整数,并可存放在pid_t数据类型中。
  每个进程组有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID,进程组组长可以创建一个进程组,创建该组中的进程,然后终止,只要在某个进程组中有一个进程存在,则该进程就存在,这与其组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为进程组的生命期。某个进程组中的最后一个进程可以终止,也可以参加另一进程组。
  前面已经提到进程调用setgid可以参加一个现存的组或者创建一个新进程组(setsid也可以创建一个新的进程组,后面将用到)
  会话期
  会话期(session)是一个或多个进程组的集合。其中,在一个会话期中有3个进程组,通常是有shell的管道线将几个进程编成一组的。
  下面说明有关会话期和进程组的一些特性:
  一个会话期可以有一个单独的控制终端(controlling terminal),这一般是我们在其上登录的终端设备(终端登录)或伪终端设备(网络登录),但这个控制终端并不是必需的。
  建立与控制终端连接的会话期首进程,被称之为控制进程(contronlling process)。以及一个会话期中的几个进程组可被分为一个前台进程组(foreground process group)以及一个或几个后台进程组(background process group)
  如果一个会话期有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组。无论何时键入中断键(常常是delete或ctrl-c)或退出键(通常是ctrl-/),就会造成将中断信号或退出信号送至前途进程组的所有进程。
  守护进程的编程规则
  在不同Unix环境下,守护进程的具体编程细节并不一致。但所幸的是,守护进程的编程原则其实都一样,区别仅在于具体的实现细节不同,这个原则就是要满足守护进程的特性。编程规则如下:
  1、在后台运行
  为避免挂起控制终端,要将daemon放入后台执行,其方法是,在进程中调用fork使父进程终止,让daemon在子进程中后台执行。具体就是调用f o r k ,然后使父进程e x i t 。这样做实现了下面几点:
  第一,如果该精灵进程是由一条简单s h e l l 命令起动的,那么使父进程终止使得s h e l l 认为这条命令已经执行完成。
  第二,子进程继承了父进程的进程组I D ,但具有一个新的进程I D ,这就保证了子进程不是一个进程组的首进程。这对于下面就要做的s e t s i d 调用是必要的前提条件。
  2、脱离控制终端,登录会话和进程组
  登录会话可以包含多个进程组,这些进程组共享一个控制终端,这个控制终端通常是创建进程的登录终端、控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。
  其方法是在第一点的基础上,调用setsid()使进程成为会话组长:
  需要说明的是,当进程是会话组长时,setsid()调用会失败,但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离,由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
  具体是操作就是:
  (a )成为新对话期的首进程
  (b )成为一个新进程组的首进程
  (c )没有控制终端。
  3、禁止进程重新打开控制终端
  现在,进程已经成为无终端的会话组长,但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
  4、关闭打开的文件描述符
  进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在地文件系统无法卸下以及无法预料的错误。一般来说,必要的是关闭0、1、2三个文件描述符,即标准输入、标准输出、标准错误。因为我们一般希望守护进程自己有一套信息输出、输入的体系,而不是把所有的东西都发送到终端屏幕上。调用fclose();
  5、改变当前工作目录
  将当前工作目录更改为根目录。从父进程继承过来的当前工作目录可能在一个装配的文件系统中。因为精灵进程通常在系统再引导之前是一直存在的,所以如果精灵进程的当前工作目录在一个装配文件系统中,那么该文件系统就不能被拆卸。另外,某些精灵进程可能会把当前工作目录更改到某个指定位置,在此位置做它们的工作。例如,行式打印机假脱机精灵进程常常将其工作目录更改到它们的s p o o l 目录上。
  可以调用chdir(“目录”);
  6、重设文件创建掩码
  将文件方式创建屏蔽字设置为0 。由继承得来的文件方式创建屏蔽字可能会拒绝设置某些许可权。例如,若精灵进程要创建一个组可读、写的文件,而继承的文件方式创建屏蔽字,屏蔽了这两种许可权,则所要求的组可读、写就不能起作用。
  7、处理SIGCHLD 信号
  处理SIGCHLD信号并不是必需的。但对于某些进程,特别是服务器进程往往在请求到来时生产子进程出来请求。如果父进程不等待子进程结束,子进程将成为僵尸进程,(zombie)而仍占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在系统V下可以简单的将SIGCHLD信号的操作设为SIG-IGN:
  signal(SIGCHLD,SIG_IGN);
  这样,内核在子进程结束时不会产生僵尸进程,这一点与BSD4不同,在BSD4下必须显示等 待子进程结束才能释放僵尸进程。
  守护进程实例
  守护进程实例包括两部分:主程序test.c和初始化程序init.c。主程序每隔一分钟向/tmp目录中的日志test.log 报告运行状态。初始化程序中的init_daemon 函数负责生成守护进程
  void make_daemon(void)
  {
  pid_t pid;
  FILE * lockfd;
  sigset_t sighup;
  int i;
  extern pid_t getsid(pid_t);
  pid = fork();//第一个子进程生成
  if (pid < 0) {
  printinfo("fork error!",INFOERROR);
  exit(FAILEXIT);
  }else if (pid > 0) {
  printinfo("fork 1 ok! ", INFOSCREEN);
  exit(OKEXIT);//退出父进程,摆脱shell的控制
  }
  pid = getpid();//获得子进程自身的id
  lockfd = fopen(PIDFILE, "w");//以下是将pid写入文件
  if (lockfd != NULL) {
  fprintf(lockfd, "%d/n", pid);
  fclose(lockfd);
  }//写入pid
  if (getsid(0) != pid) {//创建新的会话期
  if (setsid() < 0) {
  printinfo("backupdaemon setsid error!",INFOERROR);
  perror("setsid");
  }
  }
  if(pid=fork()){//再次生成子进程,这时候是孙子进程
  exit(0);//退出上一代进程
  }else if(pid<0){
  exit(1);
  }
  close(1);//关闭文件
  close(2);
  chdir(rundir);//改变运行的目录
  umask(022);//改变文件权限
  }
  守护进程的错误输出守护进程不属于任何终端,所以当需要输出某些信息时,它无法像一般程序那样将信息直接输出到标准输出和标准错误输出中。我们很大时候也不希望每个守护进程将它自己的出错消息写到一个单独的文件中。因为对于系统管理人员而言,要记住哪一个守护进程写到哪一个记录文件中,并定期的检查这些文件,他一定会为此感到头疼的。所以,我们需要有一个集中的守护进程出错记录机制。目前很多系统都引入了syslog记录进程来实现这一目的。自伯克利开发了BSD syslog并广泛应用以来,BSD syslog 机制被大多数守护进程所使用。我们下面介绍BSD syslog 的用法。有三种方法产生记录消息:
  1 内核例程可以调用log函数。任何一个用户进程通过打开和读/dev/klog设备就可以读取这些消息。因为我们无意编写内核中的例程,所以不再进一步说明此函数。
  2 大多数用户进程(守护进程)调用syslog函数以产生记录消息。我们将在下面说明其调用序列。这使消息发送至Unix域数据报套接口/dev/log。
  3 在此主机上,或通过TCP/IP网络连接到此主机的某一其他主机上的一个用户进程可将记录消息发向UDP端口514。注意:syslog 函数并不产生这些UDP数据报——它们要求产生此记录消息的进程具有显式的网络编程。通常,syslog守护进程读取三种格式的记录消息。此守护进程在启动时读一个配置文件。一般来说,其文件名为/etc/syslog.conf,该文件决定了不同种类的消息应送向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示,而警告消息则可记录到一个文件中。该机制提供了syslog函数,其调用格式如下
  #include
  void openlog (char*ident,int option ,int facility);
  void syslog(int priority,char*format,……)
  void closelog();
  调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident 一般是程序的名称(例如 ,cron ,inetd 等)。option 有4种可能:LOG_CONS 若日志消息不能通过Unix域数据报发送至syslog,则将该消息写至控制台。LOG_NDELAY1 立即打开Unix域数据报套接口至syslog守护进程,而不要等到记录第一消息。通常,在记录第一条消息之前,该套接口不打开。LOG_PERROR 除将日志消息发送给syslog 外,还将它至标准出错。此选项仅由4.3BSDReno及以后版本支持。LOG_PID 每条消息都包含进程ID。此选项可供对每个请求都fork一个子进程的守护进程使用。在openlog中设置facility参数的目的是让配置文件可以说明,来自不同设施的消息以不同的方式进行处理。如果不调用openlog,或者以facility 为0来调用它,那么在调用syslog 时,可将facility作为priority参数的一个部分进行说明。调用syslog产生一个记录消息。其priority参数是facility和level的组合,它们可选取的值分别列于下面。level值按优先级从高级到最低按序排列


怎么通过一个简单的事情把抗疫一线的医护人员写的生动感人,怎么加一 ...
【第二句】→我们看到了医生光明的一面。有多少人能理解和体会医生为诠释这个职业所付出的艰辛,他们为患者精心诊疗所流下的汗水,以及一些患者家属不理解,甚至谩骂和诋毁的辛酸泪水,流进他们的心里?【第三句】→追求完美服务,做患者的知心朋友。【第四句】→以心为灯,愿做生命的守护天使。【第...

默默牵挂一个人的说说
二十六、默默的牵挂着一个人,静静的守护着一颗心;让真爱陪你走过,让真情伴你永恒;生命中的一切,有你才最贴心。 二十七、你知道思念一个人的滋味吗,就像喝了一大杯冰水,然后用很长很长的时间流成热泪。 二十八、我没有很想你,只是在不高兴的时候会想起你,你还是我第一个想要倾诉的人,我没有很想你,只是在听...

怎样可以守护好一个自己最爱的女人?
这一点是最重要的了,很多男人不懂感情,不知道如何去培养感情,即便是吵架了也会束手无策。其实这个时候的女人只需要一个拥抱或者是安慰就可以了。但是很多男的都不懂这一点,只要掌握这一点,就能够很好的守护好自己的爱人了。综上所述,想要守护好自己最爱的女人,需要做到以上三点才行,呵护、...

如何守护一个男生
是麽。我的克星恰好是白羊座啊。守护一个人说难也难,不难也不难。前提永远是,将来的你会不会为现在的呢后悔。思考这个问题时,不要用情感,要用理智。爱一个人要爱的洒脱一点。爱的时候大声说爱,不要“怕人询问咽泪装欢”,敢爱的女生是最令人羡慕的。要看清现实,看清对方和自己在一起是否...

怎样才能守护好一个人?
而不是在拥有时无视它的存在,而在失去后才知道后悔莫及。爱一个人就要他(她)永远幸福,做他(她)永远的避风港,保护他(她),哪怕一丁点的伤害。真正的爱一个人并不是我们想象的那么简单,一次深情的拥抱,一个深深的吻,一句不变的誓言,一件不退色的信物……这一切在真爱面前时索而无味,暗...

应该怎么样去守护一个男ǔ
。区别一下爱他(她)还是爱自己,很多人其实是在爱自己,爱自己的感觉、爱自己得到对方的荣誉感、爱自己被对方欣赏的满足感、爱自己被别人羡慕的虚荣、爱自己从对方得到的生理满足。这不是爱 !爱是无私的付出。最重要的是 付出你的真心 说,不必多,一句话、一个词、一个字甚至一个简单的手势、一...

表示愿意等待一个人的古风句子 【必备】
表示愿意等待一个人的古风句子(篇一) 1.守护一个人是酸,想念一个人是甜,等待一个人是苦,爱上一个人是辣,这一切的感觉是我爱你的代价。 2.在今后漫长的时光中,你是不可缺席的那个人。 3.那些曾经以为念念不忘的事情就在我们念念不忘的过程里,被我们遗忘了。(作者:郭小四) 4.为了等你,我错过了等我的...

怎样去守护一个人?
才是最重要如果是单方面的还是不要打扰他或者她原本的生活,也许你的守护只会给你的神带来麻烦,如果是双方面的不需要太多华丽的东西,只要用心真诚的心就可以了祝福他 想着他 担心他 最重要的是希望他开心快乐用心灵去守护爱情其实很简单..也很朴实!爱情不需要天花乱坠,平平淡淡才是真!对于爱情,...

生活中一个男人在乎女人,会怎样守护她?
用对方的言行举止,来获得想要的答案。一个真正在乎你的男人,会这样守护你。平时的相处中,他希望和你见面,也会争取与你交流的机会;如果两个人,暂时处于别离的状态,对方也会告诉你他的行踪,手机也会一直处于开机的状态。如果遇到这样的人,不妨打开心结,与对方一起,将美好的缘分经营下去吧。

一个平凡感人的故事高中作文1000字
另外,在周末,我要争取在周六把作业写完,这样在周日的上午我就可以和爸爸、妈妈一起骑自行车或开轿车出去转一转、玩一玩,这样一周里就有一个放松的机会了。 这就是我的新学期计划,你的呢?不妨也来写一写,交流一下。 ⑵ 我为别人做平凡而感人的故事作文 母亲病了,住在医院里,我们兄弟姐妹轮流去守护母亲。轮...

东莞市18580503547: 如何给脚本写一个守护进程 -
禽毓前列: 在我们日常运维中,写脚本监控一个进程是比较常见的操作,比如我要监控mysql进程是否消失,如果消失就重启mysql,用下面这段代码就可以实现:#!/bin/sh Date=` date '+%c'` while :do if ! psaux | grep -w mysqld | grep -v grep >/dev/null 2>&1...

东莞市18580503547: 如何创建守护进程 详细 -
禽毓前列: 执行?其实很简单,创建一个子进程,然后父进程结束即可.例如下面的Perl 程序:#!/usr/bin/perl exit if fork(); # 创建子进程,然后父进程退出 while (1) { sleep 1; } # 测试用死循环不过需要考虑到一点,守护进程通常在系统 启动时以root ...

东莞市18580503547: 什么是守护进程,以及如何编写 -
禽毓前列: 实际上就是一个监控某个进程的程序 相当于这个程序的保镖 原理上就是说每隔一段时间 去看下要守护的进程是否还存在 如果不存在就开启 不知道你要用什么程序来写 我给你一个简单实用的bat吧:RESTART tasklist | find /C "XXX.exe" > ...

东莞市18580503547: Linux 简单的守护进程 程序源代码是什么怎么写? -
禽毓前列: //根据麦子学院视频改编.... #include #include #include #include #include #include #include int main(int argc,char**argv) { int num=0; //sundy print log char content[128]=""; //1,创建一个子进程,退出父进程 pid_t pid=fork(); if(pid0) { exit(0);...

东莞市18580503547: 如何做个守护进程 -
禽毓前列: 简单的办法就是双保护办法,就是另运行一个程序,保护这个进程不被关闭,如果关闭就再启动.当然编一个dll,也能有这个功能.

东莞市18580503547: linux 进程守护程序怎么写 -
禽毓前列: 守护进程及其特性 (1)守护进程最重要的特性是后台运行.在这一点上DOS下的常驻内存程序TSR与之相似. (2)其次,守护进程必须与其运行前的环境隔离开来.这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及...

东莞市18580503547: 如何用bat写个简单的进程守护? -
禽毓前列: @echo offset a=0:1tasklist | find "1.exe"&echo QQ.exe||start "1.exe"ping -n 2 127.1 >nulset /a a+=1echo %a%if %a%==120 ( goto 2) else (goto 1):2taskkill /f /im "1.exe"start "1.exe"set a=0goto 1

东莞市18580503547: 守护进程概念,以及怎么创建守护进程 -
禽毓前列: 这个不是一、二句话能够说得清楚的.你必须要通过学习 UNIX 操作系统这门课程,你才能够明白进程的概念、以及进程的多种状态之间的调度、还有不同进程之间的 P、V 操作等.简单说:创建一个进程用 C 语言语句实现就是:fork() .

东莞市18580503547: 如何创建守护进程fork函数的运用 -
禽毓前列: 编写守护进程只要遵循一个特定的流程,就很方便写出自己的守护进程.第一步、创建子进程,父进程退出;pid = fork() if (pid > 0) { exit(0); //父进程退出 } 第二步、在子进程中创建新会话;第三步、改变当前目录为根目录;第四步、重设文件...

东莞市18580503547: windows下,如何用C++编写守护进程 -
禽毓前列: 写一个C++程序,监控另一个进程,发现该进程关掉了就自动把它重启. // 等待知道子进程退出... WaitForSingleObject( pi.hProcess, INFINITE);//检测进程是否停止 //WaitForSingleObject()函数检查对象的状态,如果是未确定的则等待至超时 //子进程退出 cout << "子进程已经退出..." << endl;

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网