1. 程式人生 > >Linux 執行多行命令的方法與區別(解決supervisor啟動使用GPU的python服務)

Linux 執行多行命令的方法與區別(解決supervisor啟動使用GPU的python服務)

在很多情況下,我們需要一次性執行多條命令。比如我在用supervisor啟動python服務的時候就有類似的需求。

對於我的例子背景是通過supervisor監控python在python 35環境下的GPU使用的服務,其中分三個塊:python35環境的需求、GPU服務的使用、服務自動重啟。當python掛掉的時候,supervisor要能夠監控到並實現自動重啟,在用GPU的時候就會有個坑,error code(2): out of memory,很多用GPU的小夥伴不會對這個error陌生的。我們做的影象處理相關的服務,儘管我們限制圖片及batch的大小並進行了圖片壓縮處理,但是依然無法儲存這種問題不出現,但是出現後,我們發現python依然佔用著GPU的memory沒有釋放,你重啟服務會一直失敗,除非你kill掉python。

error 如下:

THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1524582441669/work/aten/src/THC/generic/THCStorage.cu line=58 error=2 : out of memory

但是GPU卻沒有釋放

那我們在supervisor的configure的command裡就得需要執行多行語句了。

killall python

source activate py35

python /home/lawenliu/myservice

那這個時候我們就需要考慮幾條命名的執行關係了。首先了解一下幾種命令連線服務的關係。

1. “||”:用於連線兩條命令,第一條命令失敗的時候,才會執行第二條語句

2. “&&”:用於連線兩條命令,第一條命令執行成功的情況下才會執行第二條語句

3. “;”:用於連線兩條命令,兩條命令執行相互獨立,第一條執行成功與否不會影響第二條(當然特殊情況除外,比如系統重啟、關機、關閉命令列,則會造成第二條命令列被丟棄)

4. “|”:用於連線兩條命令,起到管道作用,把第一條的結果傳輸給第二條命令,第一條命令執行出錯及第二條命令出錯都會報錯

從上面幾個命令連線符,我們選擇如下方式改變supervisor裡命令列:

killall python;source activate py35 && python /home/lawenliu/myservice