退出终端后子进程仍运行?dd进程PPID变更及父子进程终止疑问
终端退出后子进程存活相关问题解答
1. 为什么退出终端窗口后子进程还在运行?
这核心在于进程会话关系和信号处理机制:
- 你在终端里启动的进程(比如
dd),默认会以终端shell(bash/zsh等)作为父进程,并且同属于一个终端会话。 - 当关闭终端时,shell进程会收到
SIGHUP信号并退出,同时系统会把这个信号发送给会话内的所有子进程,默认情况下子进程收到SIGHUP会终止。 - 但如果子进程被配置为忽略
SIGHUP信号(比如用nohup dd ... &启动),或者进程本身已经脱离了终端会话的控制,那它就不会被这个信号终止,会继续在后台运行。
2. 执行dd后关终端,dd仍运行且PPID变了,发生了什么?杀死父进程一定会终止子进程吗?
dd进程的变化:
当终端shell(dd的父进程)退出后,dd就成了孤儿进程——没有父进程的进程。Linux系统里的初始化进程(现在一般是systemd,PID固定为1;早期是init)会自动接管所有孤儿进程,所以你会看到dd的PPID变成了1,这就是它被PID1进程收养了。
杀死父进程≠终止子进程:
完全不是!父进程和子进程是独立的执行实体,父进程的退出不会直接导致子进程终止,除非这两种情况:
- 父进程在退出前主动给子进程发了终止信号(比如
SIGTERM); - 子进程的运行完全依赖父进程提供的资源(比如父进程是子进程的唯一数据源,这种场景很少见)。
像dd这种做磁盘读写的进程,它的运行不依赖终端或父进程,所以即使父进程挂了,它该干嘛干嘛,直到完成I/O任务或者收到其他终止信号。
内容的提问来源于stack exchange,提问作者Sinoosh
相关产品推荐
相关产品推荐

