后臺運行腳本
需求:很多時候我們會在 linux 服務器上執行 python 腳本,然而腳本程序執行的時間可能比較長,當耗時過長的情況下,我們使用 ssh 遠程登錄到 linux 服務器上容易造成超時自動斷開連接,當用戶注銷時,終端會收到 hup(hangup)信號從而關閉其所有子進程,會導致正在執行中的 python 腳本被中斷,為了解決這一問題,我們使用 nohup 命令并結合 & 解決此問題。
命令格式:nohup command &
nohup 指:在忽略掛起信號的情況下運行給定的命令,以便在注銷后命令可以在后臺繼續運行;nohup 并不支持后臺運行,它是忽略內部的掛斷信號,不掛斷運行
& 指:后臺運行,即將進程放到后臺運行,這里的后臺,其實指的是當前登陸終端的后臺,如果在命令尚未執行完畢時就退出登陸,則此命令的執行會被中斷。
那么,如果將 nohup 與 & 結合在一起使用,這樣就可以不掛斷的永久在后臺執行。
命令示例:(將 test.py 輸出的內容寫入到 test.out 文件中)nohup python -u test.py 參數1 參數2 參數3 > test.out 2>&1 &
其中 “2>&1” 表示:將錯誤和輸出都傳到 test.out 文件中,默認狀態只把輸出輸出到文件中
如果去掉末尾的 ‘&’ ,則表示此命令會在終端前臺工作,所有輸出的內容會寫入到 test.out 文件。
實時查看 test.py 輸出的內容:tail -f -n 20 test.out
啟動腳本
例如我要同時運行多個python腳本,可以這么創建一個start.sh
#!/bin/bash
cd ./middle_back_end/backend/
nohup python -u backend_today.py >/home/hanhan/InternShipProject/out/today.out 2>&1 &
nohup python -u backend_yestoday.py >/home/hanhan/InternShipProject/out/yestoday.out 2>&1 &
nohup python -u backend_getnums.py >/home/hanhan/InternShipProject/out/getnums.out 2>&1 &
cd /home/hanhan/InternShipProject/front_middle_end/backend/
nohup python -u backend.py >/home/hanhan/InternShipProject/out/flask.out 2>&1 &
然后在sh文件目錄下,通過命令sh start.sh
運行腳本。然后我們看看是否運行成功:
運行命令ps -ef | grep backend
(因為我這邊腳本名字中都有backend這個字眼),可以看到確實都在運行
[root@VM-90-225-centos /home/hanhan/InternShipProject]# ps -ef | grep backend
root 13618 1 8 14:26 pts/7 00:00:35 python -u backend_today.py
root 13619 1 8 14:26 pts/7 00:00:35 python -u backend_yestoday.py
root 13620 1 0 14:26 pts/7 00:00:00 python -u backend_getnums.py
root 13621 1 0 14:26 pts/7 00:00:00 python -u backend.py
root 13846 13621 0 14:26 pts/7 00:00:02 /usr/bin/python /var/www/html/InternShipProject/front_middle_end/backend/backend.py
root 24194 23153 0 14:33 pts/3 00:00:00 grep --color=auto backend
關閉腳本
將剛剛創建的幾個進程一次性kill掉,創建stop.sh
#!/bin/sh
ps -ef |grep backend | grep -v grep | awk '{print $2}' | xargs kill -9
第一段前面兩節不陌生,是查找某個進程,第三節的意思是過濾grep(一般調用前兩節命令后顯示的有兩段數據,過濾的就是第二段無用的數據),第四節的意思是找出進程號
$2:表示第二個字段
print $2 : 打印第二個字段,第五節的意思是殺死找出的進程號.
然后在sh文件目錄下,通過命令sh stop.sh
運行腳本。
最后再通過ps -ef |grep backend
命令觀察,發現kill成功。
參考
Linux 自動關閉某個進程腳本
nohup運行python腳本_linux 下 Python 腳本后臺執行(nohup command &)
Linux中執行shell腳本的4種方法總結