在大多数 UNIX 系统上,这不会让进程保持运行状态:
ssh example.net sleep 1000
<<CTRL-C>>
我已经测试过这种行为
aix
centos
debian
dragonfly
freebsd
hpux
irix
mandriva
miros
netbsd
openbsd
openindiana
qnx
redhat
scosysv
solaris-x86
solaris
suse
tru64
ubuntu
unixware
他们都按预期清理干净。在 HURD 上,登录 shell 按预期被终止,但 sleep 仍作为 init 的子进程运行。为什么?并且可以缓解吗?
$ uname -a
GNU hurd 0.5 GNU-Mach 1.4-486/Hurd-0.5 i686-AT386 GNU
$ echo $SHELL
/bin/bash
$ /bin/bash --version
GNU bash, version 4.3.24(1)-release (i486-pc-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
答案1
在赫德常见问题解答中,您可以找到有关此案例的一些信息:
??什么是登录 shell?
{MB} Hurd 有未登录用户的概念。该用户既没有用户 ID,也没有组 ID。这是因为 Hurd 支持 uid 和 gid 集,当然,一种可能性是空集。在这种情况下,Hurd 中的文件系统不会拒绝访问,而是提供了第四个权限三元组(即 rwx),用于确定没有凭据的用户的权限。然而,这需要逐个文件地启用。默认情况下,使用“other”权限三元组。
Hurd 登录 shell 是一个既不使用 uid 也不使用 gid 运行的 shell。要限制对文件的访问,请启用并更改第四个权限三元组,或者将密码文件中“login”用户的登录 shell 更改为“/bin/loginpr”,以实现标准登录提示。
请记住,Hurd 不是 UNIX。它是 UNIX 内核的替代品,使用 Match Microkernel,因此,UNIX 中的许多概念不适用于 Hurd。
Mach 是一个微内核,由卡内基梅隆大学编写。一个更具描述性的术语可能是最大公因数内核,因为它提供了所有“真实”操作系统所共有的设施,例如内存管理、进程间通信、进程和一堆其他东西。不幸的是,用于访问这些设施的系统调用仅与熟悉且珍视的 Unix 系统调用有模糊的关系。没有“fork”、“wait”或“sleep”系统调用,没有SIGHUP,没有类似的东西。所有这些使得将 GNU Emacs 移植到 Mach 机器上变得相当困难。
参考: