有一個用于激活 python venv 并在后臺運行服務器的腳本,但現在我試圖在啟動行程時保留 pid,然后在完成后用 pid 終止行程。然而,并不是所有的時間都被殺死。
我的問題是,我可以使用名稱運行行程,然后使用 pkill name 將其殺死嗎?那看起來會怎樣
#!/bin/sh
ROOT_DIR=$(pwd)
activate(){
source $ROOT_DIR/.venv/bin/activate
python3 src/server.py -l & pid=$! # <== This is the process
python3 src/client.py localhost 8080
}
activate
sleep 10
kill "$pid"
printf "\n\nServer is done, terminating processes..."
uj5u.com熱心網友回復:
您可以使用 bash buildin 運行具有特定命令名稱的程式exec。請注意, exec 將 shell 替換為命令,因此您必須在子 shell 環境中運行它,例如:
( exec -a my_new_name my_old_command ) &
但是,它可能對您沒有多大幫助,因為這會設定命令列名稱,這顯然與command name不同。因此,執行上述代碼段會將您的行程顯示為“my_new_name”,例如在topor中htop,但是會按命令名稱pkill進行killall過濾,因此不會找到名為“my_new_name”的行程。
雖然有趣的是,如何以不同于可執行檔案的名稱啟動命令,但這很可能不是問題的原因。PID 永遠不會改變,所以我認為問題出在不同的地方。
我最好的猜測是服務器系結了一個套接字來監聽特定的埠。如果程式沒有正常關閉而是終止,則埠號仍然被占用,并且只有在某種內核垃圾收集程序中一段時間??后才會被內核釋放。如果程式在短時間內重新啟動,它會發現埠已被占用并列印一條誤導性訊息,表明它已經在運行。如果這確實是您的問題的原因,我會強烈考慮實施一種優雅關閉服務器的方法。(可能已經在解構式中關閉了套接字或類似的東西可能會有所幫助)
uj5u.com熱心網友回復:
我認為您應該在這種情況下使用 systemd: https ://github.com/torfsen/python-systemd-tutorial
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428514.html
