如:
SAM0:2345:respwan:/home/app/bin/app >/dev/null 2>/tmp/掘桥stderr.app
所以,有时候对进程进行实时监控,当发现进程挂掉时,立刻重新启动进程,也是一种可以救急的方式(当然这个只是一种临时救急,并不是根本解决方法)。实现方式:使用fork()创建子进程,子进程用于执行具体功能,主进程只是用于监控子进程,当主进程检测到子进程挂掉后,可以实现立即重新启动子进程。
子进程结束,系统会向主进程发送信号:SIGCHLD,主进程可以通过捕捉该信号,从而检测子进程已经不存在,进而继续下一步 *** 作。如果需要,主进程还可以获得子进程是为何退出的。
源代码例子:#include#include#include#include#include#include#includevoid process_exit(int s){exit(0)}void child_fun(){printf("child_fun. ppid %d\n",getppid())
char *st = NULL
strcpy(st, "123")}void fork_child(){pid_t child_process
int status
int signal_num
wait(&status)//等待子进程中断或终止,释放子进程资源,否则死掉的子进程会变成僵尸进程
//如果子进程是由于某种信号退出的,捕获该信号
if(WIFSIGNALED(status))
signal_num = WTERMSIG(status)
child_process = fork()
if(child_process == 0){printf("fork new child process.\n")
child_fun()}}int main(){pid_t child_processint i = 0while(1){printf("fork new process.\n")
child_process = fork()
if(child_process >0){while(1){//捕获子进程结束信号
signal(SIGCHLD, fork_child)
signal(SIGTERM, process_exit)
pause()//主进程休眠,当有信号到来时被唤醒。}}else if(child_process == 0){child_fun()}}return 0}僵尸进程的产生:
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程如果没有给子进程收尸,死掉的子进程就变成僵尸进程了。僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被培森仿调度,仅仅在配纤进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间,它需要它的父进程来为它收尸。僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",春烂过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程的危害:
Linux系统对运行的进程数量有限制,如果产生过多的僵尸进程占用了可用的进程号,将会导致新的进程无法生成。这就是僵尸进程对系统的最大危害。
1.根据进程号进行查询:# pstree -p 进程号
# top -Hp 进程号
2.根据进程名字进行查询:
# pstree -p `ps -e | grep server | awk '{print $1}'做答`
# pstree -p `ps -e | grep server | awk '{print $1}'` | wc -l
这里利用了管道和命令替换,
关于命令替换,我也是今天才了解,就是说用``括起来纯禅慧的命令会优袭胡先执行,然后以其输出作为其他命令的参数,
上述就是用 ps -e | grep server | awk '{print $1}' 的输出(进程号),作为 pstree -p 的参数
管道和命令替换的区别是:
管道:管道符号"|"左边命令的输出作为右边命令的输入
命令替换:将命令替换符"``"中命令的输出作为其他命令相应位置的参数
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)