天天看點

shell程序管理

shell程序管理

判斷程序是否還在work,如果程序被kill掉進行重新開機

python_path=/da1/hdp-svideo-algo/wangxiaoyang/miniconda3/bin/python

src_base_dir=/da1/hdp-svideo-algo/wangxiaoyang/zm/recall/src
mod_name=action_dislike_userid.py

NUM=`ps aux | grep ${mod_name} | grep -v grep |wc -l`

curr_time=$(date)

echo ${curr_time}, "process cnt of ${mod_name},${NUM}
if [ "${NUM}" -lt "1" ];then
    echo "${mod_name}
    cd ${src_base_dir}
    nohup ${python_path} ${src_base_dir}/${mod_name} &
fi      

tips

ps aux | grep      

傳回結果為:

下面第二行傳回的原因是grep本身就是一個程序,如果隻看程序名對應的程序資訊,我們需要進行過濾

ps aux | grep zm_cold | grep -v grep      

nohup指令

nohup Command [ Arg … ] [ & ]      

無論是否将 nohup 指令的輸出重定向到終端,輸出都将附加到目前目錄的 nohup.out 檔案中。如果目前目錄的 nohup.out 檔案不可寫,輸出重定向到 $HOME/nohup.out 檔案中。如果沒有檔案能建立或打開以用于追加,那麼 Command 參數指定的指令不可調用。

nohup command &      

nohup 指令運作由 Command 參數和任何相關的 Arg 參數指定的指令,忽略所有挂斷(SIGHUP)信号。在登出後使用 nohup 指令運作背景中的程式。要運作背景中的 nohup 指令,添加 & ( 表示“and”的符号)到指令的尾部。

如何檢視nohup指令?

jobs      

jobs指令隻看目前終端生效的,關閉終端後,在另一個終端jobs已經無法看到背景跑得程式了,此時利用ps(程序檢視指令)

ps -aux | grep      
a:顯示所有程式 
 u:以使用者為主的格式來顯示 
 x:顯示所有程式,不以終端機來區分      

再用awk提取一下程序ID

ps -aux | grep zm_cold | grep -v grep | awk '{print $2}'      

nohup重定向

作業系統中有三個常用的流:
  0:标準輸入流 stdin
  1:标準輸出流 stdout
  2:标準錯誤流 stderr      

2>&1的意思

這個意思是把标準錯誤(2)重定向到标準輸出中(1),而标準輸出又導入檔案output裡面,是以結果是标準錯誤和标準輸出都導入檔案output裡面了。 至于為什麼需要将标準錯誤重定向到标準輸出的原因,那就歸結為标準錯誤沒有緩沖區,而stdout有。這就會導緻 ​

​>output 2>output​

​​ 檔案output被兩次打開,而stdout和stderr将會競争覆寫,這肯定不是我門想要的. 這就是為什麼有人會寫成: ​

​nohup ./command.sh >output 2>output​

​出錯的原因了 。

nohup ./program >/dev/null 2>log &
//什麼資訊也不要
nohup ./program >/dev/null 2>&1 &      

繼續閱讀