Linux 注销时bash如何处理作业?

Linux 注销时bash如何处理作业?,linux,bash,nohup,Linux,Bash,Nohup,据我从书籍和bash手册中了解到的是。当用户从bash注销时,如果用户未使用nohup或disown,则用户启动的所有后台作业将自动终止。但今天我测试了它: 登录到我的gnome桌面并访问gnome终端 终端中有两个选项卡,在其中一个选项卡中,我创建了一个名为test的新用户,并作为test登录 su - test 开始写剧本 cat test.sh #!/bin/bash sleep 60 printf "hello world!!" exit 0 ./test.sh &

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

  • 登录到我的gnome桌面并访问gnome终端
  • 终端中有两个选项卡,在其中一个选项卡中,我创建了一个名为test的新用户,并作为test登录

    su - test
    
  • 开始写剧本

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

  • 在下一个选项卡中,我以root用户身份执行ps aux,发现作业仍在运行
    这是怎么发生的

    只有交互式shell在关闭作业时才会杀死作业。其他shell(例如使用
    su-username
    )不会这样做。交互式shell只杀死直接子进程。

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

    通常会导致
    SIGHUP
    的情况包括:

    • 当tty关闭时,前景中的任何东西
    • shell终止时包含已停止进程的任何后台作业(
      SIGCONT
      SIGHUP
      )。shell通常会在发生这种情况之前向您发出警告
    huponexit摘要:

    • 打开:当shell退出时,后台作业将通过SIGHUP终止

      $ shopt -s huponexit
      $ shopt huponexit
      huponexit       on
      
    • 关闭:shell退出时,后台作业不会以SIGHUP终止

      $ shopt -u huponexit
      $ shopt huponexit
      huponexit       off
      

    什么是交互式shell?也就是说,如果设置了$PS1,那么它就是一个交互式shell。另外,我使用ctrl+alt+f2切换到另一个tty,并作为测试登录,完成了相同的操作。结果是一样的,但是。
    su-username
    会给你一个交互式shell。你是说,如果没有设置huponexit选项,那么bash不会杀死用户的后台作业?@Unni–如果设置了
    huponexit
    ,当交互式登录shell退出时,bash会向所有作业发送SIGHUP(使用exit或Ctrl+d)。我注意到这个问题还没有一个公认的答案,还有一个类似的新问题,读起来可能很有趣: