注销时bash如何处理作业?

时间:2010-11-28 20:00:02

标签: linux bash nohup

据我从书籍和bash手册中了解到的那样。当用户从bash注销时,如果用户未使用nohup或disown,则用户启动的所有后台作业将自动终止。但今天我测试了它:

  1. 登录我的gnome桌面并访问gnome-terminal。
  2. 终端中有两个选项卡,其中一个我创建了一个名为test的新用户并以测试身份登录

    su - test
    
  3. 启动了一个脚本。

    cat test.sh
    #!/bin/bash
    sleep 60
    printf "hello world!!"
    exit 0
    
    
    ./test.sh &
    
  4. 之后我退出测试并关闭了标签

  5. 在下一个标签中,我以root身份执行了ps aux,发现该作业仍在运行。
  6. 这是怎么回事?

2 个答案:

答案 0 :(得分:12)

退出时是否终止运行后台作业取决于shell。 Bash通常不会这样做,但可以配置为登录shell(shopt -s huponexit)。在任何情况下,在控制进程(例如登录shell)终止后,都无法访问tty。

始终导致SIGHUP的情况包括:

  • tty关闭时前景中的任何内容。
  • 任何后台作业,当其shell终止时包括已停止的进程(SIGCONTSIGHUP)。在发生这种情况之前,贝壳通常会警告你。

huponexit摘要:

$ shopt -s huponexit; shopt | grep huponexit
huponexit       on
# Background jobs will be terminated with SIGHUP when shell exits

$ shopt -u huponexit; shopt | grep huponexit
huponexit       off
# Background jobs will NOT be terminated with SIGHUP when shell exits

答案 1 :(得分:2)

关闭它们时,只有交互式shell会终止作业。其他shell(例如使用su - username获得的shell)不会这样做。交互式shell只会杀死直接的子进程。