執行多個命令並將它們作為一個在 bash 中殺死
我想在一個 shell 上執行多個命令(程序)。他們都有自己的持續輸出,不會停止。在後台執行它們會中斷
Ctrl
-C
。我想將它們作為單個程序(可能是子shell?)執行,以便能夠使用Ctrl
-停止所有這些C
。具體來說,我想使用
mocha
(監視模式)執行單元測試,執行伺服器並執行一些文件預處理(監視模式)並在一個終端視窗中查看每個的輸出。基本上我想避免使用一些任務執行器。我可以通過在後台執行程序來實現它(
&
),但是我必須把它們放到前台來阻止它們。我想要一個包裝它們的過程,當我停止該過程時,它會停止它的“孩子”。
要同時執行命令,您可以使用
&
命令分隔符。~$ command1 & command2 & command3
這將啟動
command1
,然後在後台執行。與 相同command2
。然後就command3
正常啟動了。所有命令的輸出都會亂碼,但如果這對您來說不是問題,那將是解決方案。
如果您想稍後單獨查看輸出,您可以將每個命令的輸出通過管道傳輸到
tee
,這樣您就可以指定一個文件以將輸出鏡像到。~$ command1 | tee 1.log & command2 | tee 2.log & command3 | tee 3.log
輸出可能會非常混亂。為了解決這個問題,您可以使用 . 為每個命令的輸出添加前綴
sed
。~$ echo 'Output of command 1' | sed -e 's/^/[Command1] /' [Command1] Output of command 1
因此,如果我們將所有這些放在一起,我們會得到:
~$ command1 | tee 1.log | sed -e 's/^/[Command1] /' & command2 | tee 2.log | sed -e 's/^/[Command2] /' & command3 | tee 3.log | sed -e 's/^/[Command3] /' [Command1] Starting command1 [Command2] Starting command2 [Command1] Finished [Command3] Starting command3
這是您可能會看到的高度理想化的版本。但它是我現在能想到的最好的。
如果您想一次停止所有這些,您可以使用內置
trap
.~$ trap 'kill %1; kill %2' SIGINT ~$ command1 & command2 & command3
這將在後台和前台執行
command1
,您可以使用+殺死它。command2``command3``Ctrl``C
當你用
Ctrl
+殺死最後一個程序時C
,kill %1; kill %2
命令會被執行,因為我們將它們的執行與接收一個 INTerupt SIGnal 聯繫起來,這是通過按Ctrl
+發送的東西C
。他們分別殺死第一個和第二個後台程序(你的
command1
和command2
)。完成命令後,不要忘記移除陷阱trap - SIGINT
。完成一個命令的怪物:
~$ trap 'kill %1; kill %2' SIGINT ~$ command1 | tee 1.log | sed -e 's/^/[Command1] /' & command2 | tee 2.log | sed -e 's/^/[Command2] /' & command3 | tee 3.log | sed -e 's/^/[Command3] /'
當然,您可以看一下screen。它使您可以根據需要將控制台拆分為多個單獨的控制台。因此,您可以同時監控所有命令。