这是我的想法:
首先,我使用subprocess.Popen创建了一个进程
第二,经过一段时间后,我试图通过Popen.kill杀死它()
import subprocess
import os, signal
import time
proc1 = subprocess.Popen("kvm -hda /path/xp.img", shell = True)
time.sleep(2.0)
print 'proc1 = ', proc1.pid
subprocess.Popen.kill(proc1)
Run Code Online (Sandbox Code Playgroud)
但是,"proc1"仍然存在于Popen.kill()之后.任何专家都可以告诉我如何解决这个问题吗?我很感激你的考虑.
感谢所有专家的评论,我做了你所做的一切,但结果仍然保持不变.
proc1.kill() #it sill cannot kill the proc1
os.kill(proc1.pid, signal.SIGKILL) # either cannot kill the proc1
Run Code Online (Sandbox Code Playgroud)
谢谢你们.
我仍然在等待你解决这个微妙问题的宝贵经验.
在Bash脚本中,我想做类似的事情:
app1 &
pidApp1=$!
app2 &
pidApp2=$1
timeout 60 wait $pidApp1 $pidApp2
kill -9 $pidApp1 $pidApp2
Run Code Online (Sandbox Code Playgroud)
即,在后台启动两个应用程序,并给他们60秒完成他们的工作.然后,如果他们没有在那段时间内完成,就杀了他们.
不幸的是,上面的代码不起作用,因为它timeout是一个可执行文件,而它wait是一个shell命令.我尝试将其更改为:
timeout 60 bash -c wait $pidApp1 $pidApp2
Run Code Online (Sandbox Code Playgroud)
但是这仍然不起作用,因为wait只能在同一个shell中启动的PID上调用.
有任何想法吗?
我正在写一个bash脚本,它做了几件事.
最初它启动了几个监视器脚本,每个脚本都运行一些其他工具.
在我的主脚本结束时,我想杀死从我的shell中生成的所有东西.
所以,它可能看起来像这样:
#!/bin/bash
some_monitor1.sh &
some_monitor2.sh &
some_monitor3.sh &
do_some_work
...
kill_subprocesses
Run Code Online (Sandbox Code Playgroud)
问题是这些监视器中的大多数都会生成自己的子进程,所以这样做(例如):killall some_monitor1.sh并不总是有用.
还有其他办法可以处理这种情况吗?
我在linux机器上运行一个python脚本,它使用subprocess.check_output()创建一个子进程,如下所示:
subprocess.check_output(["ls", "-l"], stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
问题是,即使父进程死亡,子进程仍在运行.当父母去世时,我有什么办法可以杀死孩子的过程吗?
例如来自bash:
kill -9 -PID
os.kill(pid, signal.SIGKILL) 只杀死父进程.
我用child_process.exec/ child_process.spawn到一个新的进程,然后用杀死它child.kill/ process.kill.它可以很好地处理简单的二进制可执行文件,例如cat/ ls,并且子进程就会被杀死.
然而,当到达脚本(比如P1)是叉另一个子进程(比如P2) ,仅脚本解释P1被打死,而不是子进程P2.
问题:有没有办法让Node.JS杀死这样的子进程P2?
代码工作正常run_and_kill('ls -Al /usr/lib'),但不适用于run_and_kill('firefox'):
function run_and_kill(cmd) {
var exec = require('child_process').exec,
ls = exec(cmd);
console.log('Child process started: %d', ls.pid);
ls.on('exit', function(code, signal) {
console.log('exit with code %s and signal %s', code, signal);
});
ls.kill();
}
Run Code Online (Sandbox Code Playgroud) 出于测试目的,我有这个shell脚本
#!/bin/bash
echo $$
find / >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
从交互式终端运行,ctrl + c将终止bash和find命令.
$ ./test-k.sh
13227
<Ctrl+C>
$ ps -ef |grep find
$
Run Code Online (Sandbox Code Playgroud)
在后台运行它,并且仅杀死shell将孤立在脚本中运行的命令.
$ ./test-k.sh &
[1] 13231
13231
$ kill 13231
$ ps -ef |grep find
nos 13232 1 3 17:09 pts/5 00:00:00 find /
$
Run Code Online (Sandbox Code Playgroud)
我希望这个shell脚本在退出时终止它的所有子进程,而不管它是如何被调用的.它最终将从python和java应用程序启动 - 当脚本退出时需要进行某种形式的清理 - 我应该查看的任何选项或任何重写脚本以在退出时自行清理的方法?
有没有办法干净地杀死 uvicorn?
即,如果它在终端的前台运行,我可以在它上面键入 ^C。这会导致 uvivorn 进程终止,并且所有工作进程都将被清理。(即,他们走开了。)
另一方面,如果 uvicorn 在没有终端的情况下在后台运行,那么我无法想出一种干净地杀死它的方法。它似乎忽略了 SIGTERM、SIGINT 和 SIGHUP。我可以用SIGKILL(即-9)杀死它,但是工作进程仍然存在,我必须跟踪所有工作进程并杀死它们。这并不理想。
我在 Red Hat Enterprise Linux Server 7.3 (Maipo) 上使用带有 CPython 3.7.4、uvivorn 版本 0.11.2 和 FastAPI 0.46.0 的 uvicorn。
我正在Django网站上工作,我有各种需要运行的编译程序(Compass/Sass,coffeescript,hamlpy),所以我为了方便起见制作了这个shell脚本:
#!/bin/bash
SITE=/home/dev/sites/rmx
echo "RMX using siteroot=$SITE"
$SITE/rmx/manage.py runserver &
PIDS[0]=$!
compass watch $SITE/media/compass/ &
PIDS[1]=$!
coffee -o $SITE/media/js -cw $SITE/media/coffee &
PIDS[2]=$!
hamlpy-watcher $SITE/templates/hamlpy $SITE/templates/templates &
PIDS[3]=$!
trap "echo PIDS: ${PIDS[*]} && kill ${PIDS[*]}" SIGINT
wait
Run Code Online (Sandbox Code Playgroud)
除了Django服务器之外的所有东西都在a上很好地关闭,ctrl+c因为服务器进程的PID不是python manage.py runserver命令的PID .这意味着每次我停止脚本时,我都必须找到正在运行的进程PID并将其关闭.
这是一个例子:
$> ./compile.sh
RMX using siteroot....
...
[ctrl+c]
PIDS: 29725 29726 29728 29729
$> ps -A | grep python
29732 pts/2 00:00:00 python
Run Code Online (Sandbox Code Playgroud)
第一个PID 29725是初始python manage.py runserver调用,但29732它是实际的开发服务器进程.
编辑看起来这是由于Django的自动重载功能 …