看板 Programming 關於我們 聯絡資訊
各位好,因為覺得自己爬文理解的不是很正確,加上參考前輩撰寫的內容後修改但 還是覺得怪怪的想請教: 我撰寫了一個方法 #/bin/bash single_instance() { # $0 是當前 shell script 名稱 local script_name=$(basename "$0") local script_instance=$(ps -ef | grep "${script_name}" | grep -v grep | grep -v "2>&1" | wc -l) if [ ${script_instance} -gt 2 ]; then warn " The "${script_name}" already running!" # echo -e " The ${script_name} already running!" exit 1 fi } 這邊我先撰寫一個check_function.sh如上,主要用來檢查是否有有當前執行的程序名稱 ,並且為了避免掉把grep自己的時候把自己算進去所以排除掉後用得到的值來判斷 因為我會由1個主要的Atest.sh執行後引用這個方法(source),再執行另一個Btest.sh 所以我的理解是Atest.sh對Btest.sh執行後(例如./Btest.sh),代表對Btest.sh開啟一個 cmd(排程1),而Btest.sh開始執行後會開啟自己的執行排程(排程2) 用來避免有第3個或以上的排程被執行 但我發現當我使用cronjob去呼叫我的Atest.sh時,因為我希望把log重導向到另一個檔案 ,似乎就會被視為是第3個排程而觸發到檢查變成不執行 cronjob如下 */1 * * * * cd /tmp && /tmp/Atest.sh >> /tmp/Atest.log 2>&1 我有試著echo $script_instance、還有直接把ps -ef那段直接執行出來看,但只會看到 2組對應我的script_name的值;後來發現必須要再增加| grep '2>&1' |才能夠避免重新 導向的這個動作被算進去,但不是很理解為什麼在ps -ef的時候卻沒辦法分辨得出來他也 被視作一個排程 希望有大神可以解惑,感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.71.213.108 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1713326284.A.3DF.html
kdjf: 為什麼不用lock file呢?220.128.114.241 04/18 09:31
MOONRAKER: lock file +1 114.32.67.144 04/19 10:06
yuiweq1999: 好的,我來研究看看,感謝! 111.71.213.98 05/07 10:04