19

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

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

    su - test
    
  3. 开始了一个脚本。

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

  5. 在下一个选项卡中,我以 root 身份执行 ps aux 并发现该作业仍在运行。

这是怎么回事?

4

2 回答 2

17

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

总是导致的情况SIGHUP包括:

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

huponexit 总结:

  • On:当 shell 退出时,后台作业将使用 SIGHUP 终止

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

    $ shopt -u huponexit
    $ shopt huponexit
    huponexit       off
    
于 2010-11-30T23:10:01.247 回答
2

只有交互式 shell 在您关闭它们时才会终止作业。其他外壳(例如您通过 using 获得的外壳su - username)不会这样做。交互式 shell 只杀死直接子进程。

于 2010-11-28T20:07:37.757 回答