【问题标题】:How bash handles the jobs when logout?bash 在注销时如何处理作业?
【发布时间】:2010-11-28 20:00:02
【问题描述】:

据我从书籍和 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,发现作业仍在运行。

这是怎么发生的?

【问题讨论】:

标签: linux bash nohup


【解决方案1】:

正在运行的后台作业是否在退出时终止取决于 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
    

【讨论】:

  • 所以你的意思是,如果没有设置 huponexit 选项,那么 bash 不会杀死用户的后台作业?
  • @Unni - 如果设置了huponexit,Bash 将在交互式登录 shell 退出时向所有作业发送 SIGHUP(使用 exitCtrl + d)。
【解决方案2】:

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

【讨论】:

  • 什么是交互式shell? tldp.org/LDP/abs/html/intandnonint.html 表示,如果设置了 $PS1 ,那么它就是一个交互式 shell。此外,我使用 ctrl+alt+f2 切换到另一个 tty 并以 test 身份登录并做了同样的事情。结果是一样的,但是。
  • su - username 为您提供交互式外壳。
猜你喜欢
  • 2017-02-04
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多