我在网站开发过程中连续运行了几个命令 - Django 开发服务器、“监视”模式下的 SCSS->CSS 编译器等。我希望有一个方便的命令来一起运行它们,在必要时停止它们,并在开发和运行我的应用程序时检查控制台中的输出(例如访问日志、调试打印)。
我该如何做到这一点,以便当其中一个崩溃时,整个命令退出?
我在想类似的事情多尾或 tmux,但我仍然缺少监控和终止部分。我应该自己写一些东西,还是已经有适合我的用例的好的解决方案?
我正在使用 Linux(Ubuntu)。
答案1
您可以使用set -e
shell 脚本来完成此操作。使用它时,如果任何命令返回非 0 退出状态,则会导致脚本中止。不过,其中也有一些细微差别。更多信息可以在这里找到:http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
例子:
#!/bin/bash
set -e
echo this will print
cat -z this is a malformed command which will return non-0
echo this will not print
输出:
$ bash /tmp/test.sh
this will print
cat: invalid option -- 'z'
Try 'cat --help' for more information.
$
答案2
将所有命令放在 shell 脚本中然后使用 'set -e' 怎么样?一旦您得到不同于 0 的返回码,这将立即退出您的脚本。
答案3
在 bash 脚本中,您可以在后台运行多个进程(使用&
),并等待其中任何一个进程使用 退出wait -n
。您还可以trap
从键盘进行签名ctrl-c并使用它来终止进程。此示例运行 2 个睡眠命令,当一个命令结束时,另一个命令将被杀死。如果您通过键盘中断脚本,则会杀死两个睡眠。
#!/bin/bash
myexit(){
kill -1 $pids
exit $rc
}
pids= rc=1
trap myexit 1 2
sleep 5 &
pids="$pids $!"
sleep 10 &
pids="$pids $!"
wait -n
rc=$?
myexit