之间有什么区别
$ nohup foo
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
Run Code Online (Sandbox Code Playgroud)
和
$ foo &
$ disown
Run Code Online (Sandbox Code Playgroud) 我正在写一个应用程序。它能够产生各种外部进程。当应用程序关闭时,我希望它产生的任何进程都被杀死。
听起来很容易,对吧?查找我的 PID,并递归地遍历进程树,以自下而上的方式杀死所有可见的东西。
不同之处在于,这并不正常工作。在一种特定情况下,我 spawn foo
,但foo
只是spawn ,bar
然后立即退出,继续bar
运行。现在没有关于bar
曾经是应用程序进程树一部分的事实的记录。因此,应用程序无法知道它应该杀死bar
.
我很确定我不能成为地球上第一个尝试这样做的人。那么标准的解决方案是什么?我想我真的在寻找某种方式来“标记”一个进程,这样它产生的任何进程都将无条件地继承相同的标签。
(到目前为止,我能想到的最好的方法是以不同的用户身份运行应用程序。这样,您就可以随意终止属于该用户的所有进程。但这有各种访问权限问题......)
在当前情况下,某个脚本'calling.sh'在后台启动另一个脚本'calling.sh',执行其他操作,休眠一段时间,然后以pkill called.sh
.终止'calling.sh' 。这工作正常。
然后,我还想在任何其他时间从其他终端启动“被调用的.sh”作为独立脚本,无论是在启动 call.sh 之前还是之后。这些独立的实例不应该被 'calling.sh' 杀死。
我怎样才能做到这一点?直觉说,调用脚本应该能够告诉它从同时运行的任何其他同名进程开始的进程。
作为变体,'calling.sh' 也可以启动'被调用',它是到'被调用的.sh'的符号链接。这会使管理上述情况变得复杂吗?使用符号链接需要哪些特定的注意事项和调整?
我想终止属于我将再次运行的 shell 脚本的后台进程。
这意味着在执行 shell 脚本之前,我想删除为同一脚本运行的后台进程。
从这个答案中我们了解到,您可以通过 Linux PID 命名空间实现对整个进程子树的可靠终止unshare -p
。
这是我不明白的问题:
仅当我使用-f
/--fork
选项取消共享时它才有效。
unshare -fp -- bash -c "watch /bin/sleep 10000 && echo hi"
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,kill -9
那个的PID bash
,然后观看,睡眠等都死了,正如我所希望的那样。
但是当我使用它时没有-f
:
unshare -p -- bash -c "watch /bin/sleep 10000 && echo hi"
Run Code Online (Sandbox Code Playgroud)
和kill -9
bash PID,然后将其watch
重新设置为PID 1(在我的Ubuntu上是systemd),所以我没有达到杀死所有孩子的预期效果。
问题:
--fork
必须要达到预期的效果?为什么不unshare
使用exec()
fork 还不够?kill -9
而创建的 PID 。unshare
但是当我使用 时--fork
,杀死我开始时返回的 pidunshare
将简单地杀死unshare
并bash …
我有个问题。学习进程管理我观察到一个奇怪的行为,在 CentOS 7 上。我知道杀死父进程,子进程也被杀死。但在下面的情况下不是。我运行了命令 dd,例如:
[root@server2 ~]# dd if=/dev/zero of=/dev/null &
[1] 1756
[root@server2 ~]# ps fax | grep -B2 dd
1737 pts/2 S 0:00 \_ su -
1741 pts/2 S 0:00 \_ -bash
1756 pts/2 R 1:18 \_ dd if=/dev/zero of=/dev/null
Run Code Online (Sandbox Code Playgroud)
之后,我尝试杀死(使用 SIGKILL 信号)父进程,即 bash,但此操作不会杀死 dd 进程:
[root@server2 ~]# kill -9 1741
Killed
[user@server2 ~]#
Run Code Online (Sandbox Code Playgroud)
shell 终止,但正如您在顶部命令输出中看到的那样,dd 进程仍在工作:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1756 root 20 0 107948 612 512 R 99.9 …
Run Code Online (Sandbox Code Playgroud) 前几天我尝试编写一个脚本来杀死一个PID及其所有子进程,但是在花了一些时间之后,我认为它不值得信赖,因为有时某些子进程的PPID最终会是1。
现在,我正在寻找的是如何在后台运行以下函数,并将该函数和curl
所有函数都放在同一个组中,然后在它卡住时杀死该脚本,杀死留在背景:
download(){
until curl -s -S -L -A Mozilla/5.0 -m 300 "$@"; do
echo Retrying in 5 seconds... >&2
sleep 5
done
}
for url in foo.com bar.com baz.com; do
download $url >$url &
done
wait
Run Code Online (Sandbox Code Playgroud)
我知道不需要此函数download
,但我将其包含在此处是因为它是我在此脚本中多次使用的函数。另外,我给的最大时限300来curl
,但是,在某些网络错误,它也被卡住。
process ×5
kill ×3
shell ×2
bash ×1
disown ×1
job-control ×1
namespace ×1
nohup ×1
shell-script ×1
unshare ×1