Bash 同时运行和监视多个shell命令的优雅方式是什么?
这是我正在做的一个例子;此shell代码段运行django web服务器以及运行webpack的npm进程(同时监视文件更改和重新加载/重新编译等)。为了方便起见,我将它们组合成了一个可以通过npm运行的命令,但我觉得我忘记了一些看起来比这更好的简单命令:Bash 同时运行和监视多个shell命令的优雅方式是什么?,bash,shell,multitasking,Bash,Shell,Multitasking,这是我正在做的一个例子;此shell代码段运行django web服务器以及运行webpack的npm进程(同时监视文件更改和重新加载/重新编译等)。为了方便起见,我将它们组合成了一个可以通过npm运行的命令,但我觉得我忘记了一些看起来比这更好的简单命令: p=0; q=0; endit() { kill -9 $p; kill -9 $q; }; trap endit INT; records/manage.py runserver & p=$!; npm run watch &
p=0; q=0; endit() { kill -9 $p; kill -9 $q; }; trap endit INT; records/manage.py runserver & p=$!; npm run watch & wait; q=$!; wait $p; wait $q; endit
帮助我和我衰老的记忆!:) 通过使用
kill$(jobs-p)
终止所有正在运行的作业,您可以去除p
和q
变量。类似地,不带参数的wait
将等待所有正在运行的作业完成
关于您的代码的更多说明:
- 您应该在trap命令中调用
,否则脚本即使在收到exit
后仍将继续(由于进程已经终止,导致最后的SIGINT
调用失败)wait
- 您不应该在脚本末尾调用trap命令(
),因为此时由于endit()
调用,进程已经完成wait
sleep
命令测试了代码:
trap 'kill $(jobs -p); exit' INT;
sleep 5 &
sleep 5 &
wait
我想这是我所想的最简单的版本。在我的情况下,用法是:
runon.py 'records/manage.py runserver' 'npm run watch'
这很有效,只是感觉还有更简单的东西
#!/usr/bin/env python3
import sys
import argparse
import subprocess
import time
import shlex
parser = argparse.ArgumentParser(
description='Manage multiple running commands.')
parser.add_argument('cmds', metavar="'cmdline -opts'", type=str, nargs='+',
help='a shell command to run')
args = parser.parse_args()
calls = {}.fromkeys(args.cmds)
for cmd in calls.keys():
calls[cmd] = subprocess.Popen(shlex.split(cmd), text=True)
print'start(%d): %s' % (calls[cmd].pid, cmd)
while calls:
finished = []
for name, call in calls.items():
ret = call.poll()
if ret is not None:
print('return(%d): %s' % (ret, name))
finished.append(name)
for n in finished:
calls.pop(n)
time.sleep(0.5)
除非您先用尽了所有其他选项,否则不要使用
kill-9
。