ctrl+c 会导致孤儿进程死了?

caddor9100 2015-10-10 03:42:34


脚本a 里调用脚本b , 而脚本b的代码:

nohup ./进程 &


脚本a里有while循环,所以a是不会退出的。b的代码很简答,执行完:
nohup ./进程 & 后就没有了。


问题: 启动脚本a 后, 另开一个shell, ps -fe|grep 进程,发现目标进程的父进程是1

看:

root 3943 1 3 15:40 pts/0


说明父亲是init进程,已经成为了孤儿进程。

回到第一个shell里, 按住ctrl +c 。结果,目标进程消失


为毛?

为毛导致目标进程消失,还有如何避免目标进程消失?
...全文
253 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnry 2015-10-11
  • 打赏
  • 举报
回复
不对啊,


centos7里,

./test.sh 执行后,


ps -ef | grep test

搜索不到任何东西,说明 ./test.sh已经 结束了。

我对脚本已经彻底无语了。

顺便指出 centos7里, ps -fe|grep hello.sh也是搜索不到的。
能搜索到的只有./hello

bsnry 2015-10-11
  • 打赏
  • 举报
回复
引用 8楼www_adintr_com 的回复:
你确定你没看错?

hello.sh :
./hello

这个脚本是会等待 ./hello 退出后它才退出的,父进程怎么可能会是 test.sh
++ 会等到hello退出,这种前台调用方式是堵塞的
www_adintr_com 2015-10-10
  • 打赏
  • 举报
回复
你确定你没看错?

hello.sh :
./hello

这个脚本是会等待 ./hello 退出后它才退出的,父进程怎么可能会是 test.sh
chouxiaoya8100 2015-10-10
  • 打赏
  • 举报
回复
问题2:


test.sh


#!/bin/bash

./hello.sh

while ((1))

do

echo "xxx"

done



exit 0



hello.sh :

./hello


hello.c:

int main()

{

while(1)

sleep(3);

return 0;

}



你们实验一下, 惊奇地发现, hello这个进程 父进程变成了test.sh, 其父进程似乎被修改过了。


///////////////////////////////////////
请问这个问题如何解答?

父进程似乎不存在过继的概念啊?

www_adintr_com 2015-10-10
  • 打赏
  • 举报
回复
nohup 是忽略 SIGHUP 信号, Ctrl + C 发送的是 SIGINT 信号吧
caddor9100 2015-10-10
  • 打赏
  • 举报
回复
引用 4 楼 adlay 的回复:
[quote=引用 3 楼 caddor9100 的回复:] [quote=引用 2 楼 adlay 的回复:] 他们还是属于同一个进程组的吧
1. 除了代码外,用什么法子可以看出 是否属于同一个进程组, 2. 属于谁和谁属于同一个进程组,还有属于同一个进程组怎么了? 感谢你的参与[/quote] 1. 用 ps -o pgid,pid 命令,输出的 PGID 列就是进程组 ID 2. Ctrl + C 会发送给 shell 的前台进程组. [/quote] 你好, 你注意看主楼里的 nohup 进程 &
www_adintr_com 2015-10-10
  • 打赏
  • 举报
回复
引用 3 楼 caddor9100 的回复:
[quote=引用 2 楼 adlay 的回复:] 他们还是属于同一个进程组的吧
1. 除了代码外,用什么法子可以看出 是否属于同一个进程组, 2. 属于谁和谁属于同一个进程组,还有属于同一个进程组怎么了? 感谢你的参与[/quote] 1. 用 ps -o pgid,pid 命令,输出的 PGID 列就是进程组 ID 2. Ctrl + C 会发送给 shell 的前台进程组.
caddor9100 2015-10-10
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
他们还是属于同一个进程组的吧
1. 除了代码外,用什么法子可以看出 是否属于同一个进程组, 2. 属于谁和谁属于同一个进程组,还有属于同一个进程组怎么了? 感谢你的参与
www_adintr_com 2015-10-10
  • 打赏
  • 举报
回复
他们还是属于同一个进程组的吧
caddor9100 2015-10-10
  • 打赏
  • 举报
回复
问题2: test.sh
#!/bin/bash
./hello.sh
while ((1))
do
    echo "xxx"
done

exit 0
hello.sh :
./hello
hello.c:
int main()
{
    while(1)
      sleep(3);
    return 0;
}
你们实验一下, 惊奇地发现, hello这个进程 父进程变成了test.sh, 其父进程似乎被修改过了。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧