当退出时,Bash如何处理作业?

21

据我从书籍和bash手册中所理解的,当用户从bash退出时,如果没有使用nohup或disown,由该用户启动的所有后台作业都将自动终止。但今天我进行了测试:

  1. 登录到gnome桌面并访问gnome-terminal。
  2. 终端中有两个标签页,在其中一个标签页中,我创建了一个名为test的新用户并以test身份登录

su - test
  • 开始了一个脚本。

  • cat test.sh
    #!/bin/bash
    sleep 60
    printf "hello world!!"
    exit 0
    
    
    ./test.sh &
    
  • 之后我退出了test账户并关闭了选项卡

  • 在下一个选项卡中,我以root身份执行了ps aux命令,并发现该作业仍在运行。
  • 这是怎么回事?


    我注意到这个问题还没有被接受的答案,并且在[超级用户]上有一个类似的新问题,可能会很有趣:http://superuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-the-shell-is-exited。 - Hennes
    2个回答

    19

    在退出时是否终止后台作业取决于所使用的 shell。Bash 通常不会这样做,但可以为登录 shell 配置 (shopt -s huponexit)。无论如何,在控制进程(例如登录 shell)终止后,访问 tty 是不可能的。

    总是会导致 SIGHUP 的情况包括:

    • 当 tty 关闭时前台的任何内容。
    • 任何包含已停止进程的后台作业,当它们所属的 shell 终止时 (SIGCONTSIGHUP)。通常 shell 会在此发生之前提醒用户。

    huponexit 总结:

    • 开启:Shell 退出时将以 SIGHUP 终止后台作业。

    $ shopt -s huponexit
    $ shopt huponexit
    huponexit       on
    
  • 关闭: 当 shell 退出时,后台作业将不会因 SIGHUP 而被终止。

  • $ shopt -u huponexit
    $ shopt huponexit
    huponexit       off
    

    2
    那么您的意思是,如果未设置huponexit选项,则bash不会杀死用户的后台作业? - Unni
    @Unni - 如果设置了 huponexit,当交互式登录 shell 退出(使用 exitCtrl + d)时,Bash 将向所有作业发送 SIGHUP 信号。 - Travis Clarke

    3

    只有交互式的shell在关闭时才会终止作业。其他shell(例如通过使用su - username获得的shell)不会这样做。而且只有交互式shell才会终止直接子进程。


    什么是交互式 shell?http://tldp.org/LDP/abs/html/intandnonint.html 讲到,如果设置了 $PS1,则为交互式 shell。我还使用 ctrl+alt+f2 切换到另一个 tty 并以 test 用户登录了,结果相同但有些不同。 - Unni
    1
    su - username 命令可以让你进入一个交互式的 shell。 - Dennis Williamson

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接