Shell-Script
在shell中執行阻塞程序後呼叫其他程序
我有一個本質上阻塞的程序。它首先被執行。為了執行第二個程序,我將第一個程序移到後台並執行了第二個程序。使用等待語句,我在終端等待。但是,似乎在退出 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 太短,否則當你短暫休息時它會死掉。