一起运行多个命令,如果其中一个退出则完成?

一起运行多个命令,如果其中一个退出则完成?

我在网站开发过程中连续运行了几个命令 - Django 开发服务器、“监视”模式下的 SCSS->CSS 编译器等。我希望有一个方便的命令来一起运行它们,在必要时停止它们,并在开发和运行我的应用程序时检查控制台中的输出(例如访问日志、调试打印)。

我该如何做到这一点,以便当其中一个崩溃时,整个命令退出?

我在想类似的事情多尾或 tmux,但我仍然缺少监控和终止部分。我应该自己写一些东西,还是已经有适合我的用例的好的解决方案?

我正在使用 Linux(Ubuntu)。

答案1

您可以使用set -eshell 脚本来完成此操作。使用它时,如果任何命令返回非 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

相关内容