gpt4 book ai didi

bash - 为什么 unix 后台进程有时会在我退出 shell 时死掉?

转载 作者:行者123 更新时间:2023-11-29 08:48:48 25 4
gpt4 key购买 nike

我想知道为什么我在 Bash shell 的后台进程中看到不同的行为

案例一:使用Putty(SSH)登录Unix服务器

  • 默认使用csh shell
  • 我换成了 bash shell
  • 输入 sleep 2000 &
  • 按回车键

它给了我工作编号。现在我通过点击 putty 窗口中的 x 终止了我的 session 现在打开另一个 session 并尝试查找进程..进程死了。

案例二:案例一:使用Putty(SSH)登录Unix服务器默认情况下它使用 csh shell

  • 我换成了 bash shell
  • vi mysleep.sh
  • sleep 2000 并保存 mysleep.sh
  • ./mysleep.sh

这里的区别是..我没有直接执行 sleep 命令,而是将 sleep 命令存储在一个文件中并执行该文件。

现在我通过点击 putty 窗口中的 x 终止了我的 session 现在打开另一个 session 并尝试查找进程..进程仍然存在

不知道为什么会这样。我认为即使在注销后我也需要在 bash 中执行 disown 才能运行该过程。

我在父进程 ID 中看到的一个差异..在第二种情况下..sleep 2000 的父进程 ID 变为 1。看起来一旦 mysleep.sh 进程死亡,内核就将父进程分配给 1 .

最佳答案

这里的区别确实是干预过程。当您关闭终端窗口时,一个 HUP 信号(与 an0nymo0usc0ward 提到的“nohup”相关)被发送到其中运行的进程。接收 HUP 的默认操作是死掉——来自 signal(3) 联机帮助页,

 No    Name         Default Action       Description
1 SIGHUP terminate process terminal line hangup

在您的第一个示例中, sleep 进程直接接收到此 HUP 信号并终止,因为它未设置为执行任何其他操作。 (一些进程捕获 HUP 并使用它来执行一些操作,例如重新读取一些配置文件)

在第二个例子中,运行你的 shell 脚本的 shell 进程已经死了,所以 sleep 进程永远不会得到信号。在 UNIX 中,由于 wait(2) 系列调用的工作原理以及一般进程的内部结构,每个进程都必须有一个父进程。因此,当父进程死亡时,内核将其作为寄养子进程交给 init(如您所知,pid 1)。 Orphan process (on wikipedia)有一些关于它的更多信息,另请参阅 Zombie process了解一些额外的技术细节。

关于bash - 为什么 unix 后台进程有时会在我退出 shell 时死掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com