Chinaunix
标题:
一个进程挂起的问题,求理论解释
[打印本页]
作者:
75252
时间:
2010-08-26 20:03
标题:
一个进程挂起的问题,求理论解释
有这样一条命令:
ping 163.com >> ping.log 2>&1 &
直接执行后 ctrl+F4窗口,会发现进程被干掉。这主要是ctrl+F4窗口时发送一个SIGHUP信号
会终止在这个会话下所有有终端输出的任务
如果我在外面包一层
#ping.sh
ping 163.com >> ping.log 2>&1 &
然后终端执行ping.sh,无论怎样关都没问题。
在这个问题的基础上出现了一个衍生问题
通过脚本执行时,为什么内部的那条命令会独立存在。
作者:
xiaopan3322
时间:
2010-08-26 20:13
没明白,,,,,期待讲解。。。
作者:
bbgg1983
时间:
2010-08-26 20:28
我菜鸟,讲下我的想法:
在命令行执行命令,命令是在当前shell执行的,关闭了当前shell,那么命令也就结束了
在脚本中执行命令,命令是在subshell中执行的,关闭了当前shell,subshell不受影响,那么脚本中的命令继续执行
作者:
linyunxian
时间:
2010-08-27 00:00
两种情况下的父进程不一样。
一种是当前shell, 一种是init
作者:
jiwang1980
时间:
2010-08-27 09:41
回复
3#
bbgg1983
搭车问两个问题
1.nohup 可以解决第一个问题吗?我试了,有问题,为什么
$ nohub ping 192.168.58.202 > ping.log 2>&1 &
[1] 8729
$ ps -aux|grep ping
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.3/FAQ
upload 8731 0.0 0.0 4372 660 pts/2 S+ 09:37 0:00 grep ping
[1]+ Exit 127 nohub ping 192.168.58.202 >ping.log 2>&1
2.这样是不是那个ping的shell就成了孤儿进程?
还有 已知进程id,怎么查询父进程?
作者:
bbgg1983
时间:
2010-08-27 09:55
1.nohup可以解决第一个问题,不过你运行命令的时候打错了,弄成nohub了
2.不会是孤儿进程,将会由init接管。
ps -ef就可以看父进程pid,第二列是进程pid,第三列是父进程pid
作者:
ddgfff
时间:
2010-08-27 10:18
俺来凑个热闹
在shell下直接写命令调用到后台,它的父进程是此shell,一旦此shell进程关闭,那么子进程也随之关闭了
在脚本中写的命令,在shell中执行脚本的时候会开启一个子shell去执行脚本中的命令,脚本执行完毕子shell也就退出了,子shell退出的时候会把它自己的子进程交给系统init去管理,也就是init成了后台命令的父进程,从而在后台正常执行
不知道这样说是否清晰
作者:
jiwang1980
时间:
2010-08-27 11:09
回复
6#
bbgg1983
谢谢咯,这下清楚了。
我再去试试
作者:
jiwang1980
时间:
2010-08-27 11:30
回复
7#
ddgfff
伙计你说的真对啊
问题延伸一下
如果子shell没有结束,那么ping的那个后台进程的父进程还是子shell
如果用 ctrl-c,那么子shell结束,ping的那个后台进程也被结束
如果是在另一个console里把子shell用 kill -9结束,那么ping的后台进程会交给init。
我百度了,ctrl-c和相当于 kill -2 ,发的信号不同
哥你给解释一下 kill的signal之间的差异呗。或者给个link也可以
作者:
好看的附件
时间:
2010-08-27 11:35
回复
9#
jiwang1980
<ctrl>-c发送的是SIGINT信号。
作者:
jiwang1980
时间:
2010-08-27 11:38
回复
10#
好看的附件
那进程接收到 2 和9 处理上有什么不同呢?
作者:
好看的附件
时间:
2010-08-27 11:44
回复
11#
jiwang1980
我认为这个不是进程处理的,应该是操作系统管理的,除非进程自己有做了信号处理,每种信号对应不同是中断处理。
作者:
ddgfff
时间:
2010-08-27 12:27
回复
9#
jiwang1980
我试验的结果和你的不太一样
sleep 4000 &
sleep 5000
复制代码
这个放在一个脚本中,执行起来后,我ctrl+c不会影响到后台的4k进程,只影响5k的那个
用kill -9 杀掉脚本呢,4k和5k都在后台正常运行
其实4k的那个进程和我按ctrl+c或者使用kill -9都没关系,它已经调用到后台去了,脚本不管哪种方法关闭了,它都会被交给init管理
这里和操作有关系的就是5k的这个进程
正在执行的时候按ctrl+c这个是发送了退出信号,肯定是退出的了,没啥疑问的;而kill -9杀掉脚本呢,这个脚本被强制干掉了,内核认为它不是正常退出的,那么它的子进程就由系统init接管了
kill -9发的信号是强制退出,不属于程序正常情况的退出
kill -2发的是终止信号,程序收到信号后就会进行退出的准备工作,正常退出
欢迎各位高手指正啊~
作者:
75252
时间:
2010-09-02 17:50
俺来凑个热闹
在shell下直接写命令调用到后台,它的父进程是此shell,一旦此shell进程关闭,那么子进程也 ...
ddgfff 发表于 2010-08-27 10:18
学习了哈哈,谢了
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2