当前位置: 技术问答>linux和unix
关于进程不能正常后台运行的问题
来源: 互联网 发布时间:2015-11-09
本文导语: 以前写的一个程序,在执行的时候加上&符后台运行,ps auxf察看的时候,可以看到该程序是作为 init的一个子进程 现在改完之后,再使用& 后台运行时,ps aux查看该程序是作为bash shell的一个子进程运行的,如果关...
以前写的一个程序,在执行的时候加上&符后台运行,ps auxf察看的时候,可以看到该程序是作为
init的一个子进程
现在改完之后,再使用& 后台运行时,ps aux查看该程序是作为bash shell的一个子进程运行的,如果关掉该shell,我的程序就业被关掉了,这个问题就比较奇怪了,这个是什么原因引起的呢??
init的一个子进程
现在改完之后,再使用& 后台运行时,ps aux查看该程序是作为bash shell的一个子进程运行的,如果关掉该shell,我的程序就业被关掉了,这个问题就比较奇怪了,这个是什么原因引起的呢??
|
关闭shell之后,会给该shell的所有进程发SIGHUP信号。 该信号默认处理时终止进程。
nohup命令是启动进程忽略SIGHUP信号。
你在自己的程序中,用signal(SIGHUP,SIG_IGN); 后台启动进程在关闭shell之后,不会退掉的。
nohup命令是启动进程忽略SIGHUP信号。
你在自己的程序中,用signal(SIGHUP,SIG_IGN); 后台启动进程在关闭shell之后,不会退掉的。
|
用nohup命令运行程序就好了
比如
nohup ./test &
这样就不会因为shell关闭而关闭了
比如
nohup ./test &
这样就不会因为shell关闭而关闭了
|
本来的父进程(shell)被关闭之后,就变成init的子进程了
|
被init托管就是常说的"孤儿进程“
|
在shell下运行的程序都是shell的子进程.不同的是&在后台运行会把你运行的程序放到后台进程组.而shell是在前台进程组的.
而退出shell时,会发送SIGHUP给所有的前台进程组,后台进程组是不受影响的.
所以这个时候,由于你的进程的父进程shell退出了,你的进程还没结束,被init托管,所以父进程变成了init.
而退出shell时,会发送SIGHUP给所有的前台进程组,后台进程组是不受影响的.
所以这个时候,由于你的进程的父进程shell退出了,你的进程还没结束,被init托管,所以父进程变成了init.