Shell-Script

在shell中執行阻塞程序後呼叫其他程序

  • April 8, 2022

我有一個本質上阻塞的程序。它首先被執行。為了執行第二個程序,我將第一個程序移到後台並執行了第二個程序。使用等待語句,我在終端等待。但是,似乎在退出 shell 時(按CTRL+ C),第一個程序並未順利退出。下面是shell腳本:

execute.sh

#!/bin/sh

# start process one in background
python3 -m http.server 8086 & 

# start second process
firefox "http://localhost:8086/index.html"

wait

我在這裡發現了一個類似的問題,但它似乎無法正常工作。基本上,當我./execute.sh第二次打電話時,伺服器會說“地址已在使用中”。這意味著伺服器無法和平退出。另一方面,如果我在終端中手動執行伺服器,它會順利退出。

您還可以擷取中斷以確保在按下 ctrl+c 時終止程序

#!/bin/sh

trap ctrl_c INT

ctrl_c () {
   kill "$bpid"
   exit
}

# start process one in background
python3 -m http.server 8086 &
bpid=$!

# start second process
firefox "http://localhost:8086/index.html"

wait

Firefox 退出後終止 Python 程序。

在我的頭頂上:

#!/bin/sh

# start process one in background
python3 -m http.server 8086 & 
pid=$!

# start second process
firefox "http://localhost:8086/index.html"

kill "$!"
wait         # wait for it to actually exit
            # if it ignores SIGTERM, this'll hang

或者,由於似乎從腳本啟動的 Firefox 程序實際上並沒有在前台執行(但可能只是表示現有firefox程序打開一個新視窗),所以這是行不通的。

但是我們可以例如等待使用者的輸入:

#!/bin/sh

# start process one in background
python3 -m http.server 8086 & 
pid=$!

# start second process
firefox "http://localhost:8086/index.html"

echo "Started Python HTTP server"
echo "Press enter to close it"
read tmp

echo "Asking the Python HTTP server to terminate"

kill "$!"
wait         # wait for it to actually exit
            # if it ignores SIGTERM, this'll hang

echo "Done."

另一種解決方案是在 Python HTTP 伺服器中實現空閒計時器。讓它每 N 分鐘喚醒一次,看看它自上次收到請求以來是否已經 M 分鐘或更長時間,如果是,則退出。只是不要讓 M 太短,否則當你短暫休息時它會死掉。

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