当我运行备份脚本时,首先切换到 root,安装 truecrypt 分区,然后运行脚本。
我注意到,以 root 身份运行 truecrypt 后,我可以退出 root 会话,并且 truecrypt 保持打开状态。
为什么会发生这种情况?只要我关闭 root 会话,它就不应该关闭吗?
命令顺序是:
su
truecrypt &
我使用 Truecrypt 的 UI 安装隐藏卷
./Backup.sh
然后通常是卸载 Truecrypt 的卷,关闭 Truecrypt,退出 root 会话。但是,如果我只关闭 root 会话,Truecrypt 就会继续以 root 权限运行。
答案1
后台进程获取升级版父进程(通常在 Linux 上)init
PID 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
您可以通过执行以下操作进一步可视化这一点:
将脚本展开为:
#!/bin/sh sleep 8888 & sleep 9999 ecode=$? printf "Bye\n" exit $ecode
运行它
./sleeplong2 &
(su
或不运行)。top
从与上面相同的例程开始,然后输入c以显示参数。在其他终端中:
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 信号。