相关疑难解决方法(0)


杀死所有后代进程

我正在写一个应用程序。它能够产生各种外部进程。当应用程序关闭时,我希望它产生的任何进程都被杀死。

听起来很容易,对吧?查找我的 PID,并递归地遍历进程树,以自下而上的方式杀死所有可见的东西。

不同之处在于,这并不正常工作。在一种特定情况下,我 spawn foo,但foo只是spawn ,bar然后立即退出,继续bar运行。现在没有关于bar曾经是应用程序进程树一部分的事实的记录。因此,应用程序无法知道它应该杀死bar.

我很确定我不能成为地球上第一个尝试这样做的人。那么标准的解决方案是什么?我想我真的在寻找某种方式来“标记”一个进程,这样它产生的任何进程都将无条件地继承相同的标签。

(到目前为止,我能想到的最好的方法是以不同的用户身份运行应用程序。这样,您就可以随意终止属于该用户的所有进程。但这有各种访问权限问题......)

process kill

95
推荐指数
4
解决办法
16万
查看次数

Bash 脚本应该只杀死它已经启动的另一个脚本的那些实例

在当前情况下,某个脚本'calling.sh'在后台启动另一个脚本'calling.sh',执行其他操作,休眠一段时间,然后以pkill called.sh.终止'calling.sh' 。这工作正常。

然后,我还想在任何其他时间从其他终端启动“被调用的.sh”作为独立脚本,无论是在启动 call.sh 之前还是之后。这些独立的实例应该被 'calling.sh' 杀死。

我怎样才能做到这一点?直觉说,调用脚本应该能够告诉它从同时运行的任何其他同名进程开始的进程。

作为变体,'calling.sh' 也可以启动'被调用',它是到'被调用的.sh'的符号链接。这会使管理上述情况变得复杂吗?使用符号链接需要哪些特定的注意事项和调整?

bash process

11
推荐指数
2
解决办法
1303
查看次数

在运行相同的 Unix 脚本之前终止脚本的先前实例

我想终止属于我将再次运行的 shell 脚本的后台进程。

这意味着在执行 shell 脚本之前,我想删除为同一脚本运行的后台进程。

shell-script background-process

7
推荐指数
2
解决办法
6658
查看次数

为什么基于取消共享的查杀只能与 --fork 一起可靠地工作?

这个答案中我们了解到,您可以通过 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 -9bash PID,然后将其watch重新设置为PID 1(在我的Ubuntu上是systemd),所以我没有达到杀死所有孩子的预期效果。

问题:

  • 为什么--fork必须要达到预期的效果?为什么不unshare使用exec()fork 还不够?
  • 有解决方法吗?我更希望能够方便地发送到通过开始杀死其下面的所有内容kill -9而创建的 PID 。unshare但是当我使用 时--fork,杀死我开始时返回的 pidunshare将简单地杀死unsharebash …

process kill namespace unshare

7
推荐指数
1
解决办法
1885
查看次数

杀死父进程不会杀死子进程

我有个问题。学习进程管理我观察到一个奇怪的行为,在 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)

process kill

6
推荐指数
1
解决办法
2万
查看次数

在一组中启动后台进程,然后将它们全部杀死

前几天我尝试编写一个脚本来杀死一个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,但我将其包含在此处是因为它是我在此脚本中多次使用的函数。另外,我给的最大时限300curl,但是,在某些网络错误,它也被卡住。

shell process

5
推荐指数
1
解决办法
1696
查看次数