当我退出shell时,为什么unix后台进程有时会死?

12 unix bash putty csh nohup

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

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

  • 默认情况下,它使用csh shell
  • 我改成了bash shell
  • 键入睡眠2000&
  • 按回车键

它给了我工作号码.现在我通过点击putty窗口中的x来杀死我的会话现在打开另一个会话并尝试查找进程...该进程已经死亡.

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

  • 我改成了bash shell
  • vi mysleep.sh
  • 睡2000和保存mysleep.sh
  • ./mysleep.sh

这里的Diff是..而不是直接执行sleep命令我将sleep命令存储在文件中并执行文件.

现在我通过点击putty窗口中的x来杀死我的会话现在打开另一个会话并尝试查找进程...过程仍然存在

不知道为什么会这样.我认为我需要在bash中使用,即使在注销后也要运行该过程.

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

Ste*_*ker 20

这里的差异确实是干预过程.当您关闭终端窗口时,会向其中运行的进程发送HUP信号(与"nohup"相关,如提到的a0nymo0usc0ward).接收HUP的默认操作是死 - 来自signal(3)联机帮助页,

 No    Name         Default Action       Description
 1     SIGHUP       terminate process    terminal line hangup
Run Code Online (Sandbox Code Playgroud)

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

在第二个示例中,运行shell脚本的shell进程已经死亡,因此睡眠过程永远不会获得信号.在UNIX中,由于wait(2)系列调用的工作原理以及一般的处理过程,每个进程都必须有一个父进程.因此,当父进程终止时,内核会将其作为寄养子项提供给init(pid 1,如您所述). Orphan进程(在维基百科上)提供了更多有关它的信息,另请参阅Zombie进程以获取一些其他技术细节.


Jay*_*yan 8

已经运行的过程?

^ z
bg
disown%<jobid>

新进程/脚本(在本地计算机的控制台上)?

nohup script.sh&

新进程/脚本(在远程计算机的控制台上)?

根据您的需要,
有两个选项[会有更多;-)]

ssh remotehost'nohup /path/to/script.sh </dev/null> nohup.out 2>&1&'

要么

使用'屏幕'


小智 3

尝试“nohup cmd args...”