Bash

殺死由 bash 腳本啟動的中間人伺服器?

  • July 26, 2019

我有一個看起來像這樣的 bash 腳本:

bundle exec middleman server & node script.js && 
kill -9 $(lsof -i:4567 -t) &&
bundle exec middleman build --verbose

現在,我殺死 bundle exec 中間人伺服器的方法是基於埠(localhost:4567)殺死。但是,如果埠需要更改(它會更改),這並不好。

在執行節點 script.js 之後殺死 bundle exec 中間人伺服器的最佳方法是什麼(它基本上等待伺服器線上,發送一個 get 請求並對返回的伺服器數據做一些事情)。我想做一些不依賴於埠的事情,只是按名稱或第二次最近執行的事情(或最近的伺服器執行?)

非常感謝你!

根據外殼,您應該能夠輕鬆殺死後台任務。如果您沒有在後台執行其他任何東西,它將是工作 1,因此您可以kill %1

sauer@host:~$ set -b
sauer@host:~$ sleep 10 & echo hello
[1] 18988
hello
sauer@host:~$ kill %1
[1]+  Terminated              sleep 10

如果您可能在後台有其他事情,您可以做幾件事。假設 Bash 或類似工作的 shell,您可以使用jobs -r來獲取正在執行的作業列表並 grep 作業編號,或者您可以在作業規範中指定程序名稱(百分比後面的東西)而不是數字。大概kill %bundle。或者,即使在這種情況下最有用,您也可以使用%+來指代最近的後台作業。

sauer@host:~$ set -b
sauer@host:~$ sleep 10 & sleep 11 & echo hello
[1] 19406
[2] 19407
hello
sauer@host:~$ kill %+
[2]+  Terminated              sleep 11

請注意,後台執行了兩個睡眠程序,但這%+是“最近的”一個,所以它被殺死了。也set -b只是啟用對後台作業狀態的即時回饋,而不是等到下一個提示。這只是範例。:)

哦,這裡還有一個有用的範例,展示了按名稱殺死後台任務以及如果模式匹配多個程序會發生什麼,因為它是主題。請注意,“jobs”輸出顯示最近和第二最近的工作的+和指示符,可用作工作規範中的速記。-

sauer@host:~$ sleep 10 & sleep 11 & sleep 9 & echo hello
[1] 22255
[2] 22256
[3] 22257
hello
sauer@host:~$ jobs
[1]   Running                 sleep 10 &
[2]-  Running                 sleep 11 &
[3]+  Running                 sleep 9 &
sauer@host:~$ kill %sleep
-bash: kill: sleep: ambiguous job spec
sauer@host:~$ kill %"sleep 10"
[1]   Terminated              sleep 10

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