以 root 身份打开程序,关闭 root 会话,但程序仍在运行

以 root 身份打开程序,关闭 root 会话,但程序仍在运行

当我运行备份脚本时,首先切换到 root,安装 truecrypt 分区,然后运行脚本。

我注意到,以 root 身份运行 truecrypt 后,我​​可以退出 root 会话,并且 truecrypt 保持打开状态。

为什么会发生这种情况?只要我关闭 root 会话,它就不应该关闭吗?

命令顺序是:

su

truecrypt &

我使用 Truecrypt 的 UI 安装隐藏卷

./Backup.sh

然后通常是卸载 Truecrypt 的卷,关闭 Truecrypt,退出 root 会话。但是,如果我只关闭 root 会话,Truecrypt 就会继续以 root 权限运行。

答案1

后台进程获取升级版父进程(通常在 Linux 上)initPID 1

显然 & 是为了在后台运行它。问题是,如果 root 启动但 root 不再活动,为什么它继续运行?

root只要您的系统正在运行,它就会处于活动状态。 (root超级用户。)

root无论如何,这与用户本身没有任何关系。由于您启动的进程不依赖于终端(或类似的),因此结束父进程不会终止子进程。它通常会暂时成为孤儿,然后被收养init

您的许多进程都在其他帐户下运行。尝试例如:

ps aux | awk 'NR>1{print $1}' | sort -u

为了说明这一点,可以使用另一个帐户,例如testuser

sleeplong:

#!/bin/sh
sleep 9999

保存并cmod +x sleeplong。运行在testuser

user@host $ su testuser
testuser@host $ ./sleeplong &
[1] 9692

使用 PID打开top

user@host $ pids="$(pstree -cpsa 9692 | \
sed 's/ *[^,]*,\([0-9]*\).*/\1/' | tr '\n' ',')"; \
top -w 90 -p ${pids}1

输入V获取树

  PID USER         TIME+  COMMAND
    1 root        0:01.03 init
19787 user       95:30.58  `- terminal
 8835 user        0:00.16      `- bash
 9634 testuser    0:00.04          `- su
 9642 testuser    0:00.09              `- bash
 9692 testuser    0:00.00                  `- sleeplong
 9693 testuser    0:00.00                      `- sleep

出口:

testuser@host $ exit

再次运行顶层例程:

  PID USER       TIME+  COMMAND
    1 root      0:01.03 init
 9692 testuser  0:00.00  `- sleeplong
 9693 testuser  0:00.00      `- sleep

您可以通过执行以下操作进一步可视化这一点:

  1. 将脚本展开为:

    #!/bin/sh
    sleep 8888 &
    sleep 9999
    ecode=$?
    
    printf "Bye\n"
    
    exit $ecode
    
  2. 运行它./sleeplong2 &su或不运行)。

  3. top从与上面相同的例程开始,然后输入c以显示参数。
  4. 在其他终端中:

    kill NNN # Where NNN=PID of sleep 8888
    kill NNN # Where NNN=PID of sleep 9999
    

最后的退出代码kill通常应该是143。那是

128 + 15 = 143

默认kill为 15,或SIGTERM.


另一件可以尝试的事情是杀死所在sleep 的 bash (或类似的)。


也不是你可以做的,例如:

$ su testuser -c './sleeplong &'

希望它变得更清楚一点。

答案2

它是 truecrypt 命令后面的 & 符号。这导致 truecrypt 会话在后台运行。如果删除 & 符号,它将在终端窗口关闭时关闭。

如果您想保留 &,可以使用该fg命令将会话带到前台,之后它应该随窗口一起关闭。jobs如果您有多个作业,请用于在后台列出所有作业。

答案3

这是设计使然。

关闭会话并不会关闭所有用户的程序。这是设计使然。一方面,用户可以在其他会话中运行程序。用户还可能希望在未登录任何终端时让程序在后台运行(screen或者tmux为此特别受欢迎)。

关闭会话的作用大致来说就是删除程序与用户交互的出口:在文本模式会话中,程序被告知终端已经消失(叹息);在 GUI 会话中,程序被告知X服务器已经消失了。大多数程序都会在这种情况下退出。

Truecrypt 安排继续运行,因为这通常是理想的行为。 Truecrypt 进程无法知道其他进程是否正在使用该文件系统,因此它会一直运行,直到显式卸载该文件系统。这是一个非常常见的用例:登录以安装加密卷、注销、让其他用户或自动化作业使用加密卷。

注销不会神奇地改变进程以哪个用户身份运行。无论如何,它应该改变成什么呢?

使用完文件系统后,需要卸载它。这适用于任何文件系统,而不仅仅是 Truecrypt。卸载所有 Truecrypt 文件系统后,您可以终止 Truecrypt 进程。

答案4

我无法在工作中检查这一点,但是 truecrypt 进程是否作为守护进程启动?我的意思是,pid 1 的 init 进程是 truecrypt 进程的父进程吗?

如果是,那么即使您退出 root shell,它也不会终止,因为它不会从注销中获得 SIGHUP 信号。

相关内容