Bash

執行多個命令並將它們作為一個在 bash 中殺死

  • March 14, 2018

我想在一個 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+殺死最後一個程序時Ckill %1; kill %2命令會被執行,因為我們將它們的執行與接收一個 INTerupt SIGnal 聯繫起來,這是通過按Ctrl+發送的東西C

他們分別殺死第一個和第二個後台程序(你的command1command2)。完成命令後,不要忘記移除陷阱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。它使您可以根據需要將控制台拆分為多個單獨的控制台。因此,您可以同時監控所有命令。

引用自:https://unix.stackexchange.com/questions/204480