杀死后发生了什么 - 继续?

杀死后发生了什么 - 继续?

我已经通过 暂停了一个进程kill -TSTP <pid>。然后尝试继续kill -CONT <pid>。但进程完成后,控制权不会返回到 bash。为什么会发生这种情况?以及如何克服这个问题?

我从一个 bash(比如 bash-1)开始使用./name.sh.然后kill -TSTP <pid>通过 bash-2使用命令暂停该进程。最后尝试kill -CONT <pid>通过 bash-2恢复它。但是 shell 脚本完成后,控制权不会返回,它只是永远留在那里。

答案1

从 shell 启动的进程有一个与其关联的控制 TTY,它们从 shell 继承,并且也属于进程组。当在带有 ' 的管道中运行多个进程|或使用带有()' 的子 shell 表示法时,所有这些进程都以相同的进程组启动。当用户按下暂停键时,通常Ctrl-Z从键盘,TTY 层将信号发送SIGTSTP到当前前台进程组中的所有进程,父 shell 会通过 a 唤醒SIGCHLD(或从调用返回wait())以再次处理 TTY。 shell 负责控制哪个进程组在前台,因为它控制 TTY,并且 shell 本身驻留在它自己的进程组中。

如果某个进程不是 TTY 当前前台进程组的一部分,则 TTY 层会自动停止该进程并显示 aSIGTTIN如果它尝试从终端读取数据。例如,发送SIGCONT到像 vi​​m 这样的交互式文本编辑器将恢复它,但是SIGTTIN一旦它调用read()来从键盘获取下一个按键,它就会立即得到 a 。必须使用作业控制指令通知 shell fg,它应该在恢复之前将 vim 移动到前台进程组,从而使 shell 不再处于前台。

答案2

kill -CONT是 shell 无法理解的东西。

因此,它只是继续该过程,而不会对 shell 产生任何影响。

这会产生类似于后台进程的结果。

如果您想继续某个流程,最好致电fg,或者如果这不是“当前作业”,请使用jobs列出所有当前作业,然后致电,例如,fg %3如果相关作业是作业 #3。

kill -CONT请注意,调用和从启动 shell之间的区别fg在于,使用 时fg,shell 除了发送信号之外,SIGCONT还将 tty 进程组设置为已恢复进程的进程组。 tty 进程组的设置控制信号的自动传送TSTPTTINTTOU。随后 shell 开始等待命令。

然而,如果您kill -CONT从与运行相关进程的 shell/tty 不同的 shell/tty 进行调用,那么很明显您只是继续执行外部进程。触发的 shellkill -CONT只会返回到提示符,但您会看到这一点。

相关内容