linux脚本登录启动失败,linux-从bash脚本启动进程失败
我有一臺中央服務器,在該服務器中,我定期從cron啟動腳本來檢查遠程服務器.該檢查是按順序執行的,因此首先是一臺服務器,然后是另一臺服務器.
該腳本(從中央服務器)在遠程計算機上啟動另一個腳本(將其稱為update.sh),并且該腳本(在遠程計算機上)正在執行以下操作:
processID=`pgrep "processName"`
kill $processID
startProcess.sh
該進程被殺死,然后在腳本startProcess.sh中啟動,如下所示:
pidof "processName"
if [ ! $? -eq 0 ]; then
nohup "processName" "processArgs" >> "processLog" &
pidof "processName"
if [! $? -eq 0]; then
echo "Error: failed to start process"
...
update.sh,startprocess.sh及其啟動的實際二進制文件位于從中央服務器裝入的NFS上.
現在有時發生的是,我嘗試在startprocess.sh中啟動的進程未啟動,并且出現了錯誤.奇怪的是,它是隨機的,有時一臺計算機上的進程啟動,而同一臺計算機上的另一時間沒有啟動.我正在檢查大約300臺服務器,并且錯誤始終是隨機的.
還有另一件事,遠程服務器位于3個不同的地理位置(美國2個,歐洲1個),中央服務器在歐洲.我到目前為止發現的是,美國的服務器比歐洲的服務器有更多的錯誤.
首先,我認為該錯誤與kill有一定關系,因此我在kill和startprocess.sh之間添加了sleep,但這沒有任何區別.
同樣,似乎startprocess.sh的進程根本沒有啟動,或者啟動時發生了某些事情,因為日志文件中沒有輸出,并且日志文件中應該有輸出.
所以,我在這里尋求幫助
是否有人遇到過此類問題,或者知道可能出什么問題了?
謝謝你的幫助
解決方法:
(對不起,但我最初的回答是錯誤的……這是更正)
使用$?在startProcess.sh中獲取后臺進程的退出狀態會導致錯誤的結果.男人bash指出:
Special Parameters
? Expands to the status of the most recently executed foreground
pipeline.
正如您在評論中提到的那樣,獲取后臺進程退出狀態的正確方法是使用內置的等待.但是,為此bash必須處理SIGCHLD信號.
我為此做了一個小型測試環境,以展示其工作方式:
這是一個腳本loop.sh,可以作為后臺進程運行:
#!/bin/bash
[ "$1" == -x ] && exit 1;
cnt=${1:-500}
while ((++c<=cnt)); do echo "SLEEPING [$$]: $c/$cnt"; sleep 5; done
如果arg為-x,則退出且退出狀態為1,以模擬錯誤.如果arg為num,則等待num * 5秒以打印SLEEPING [< PID>]< counter //< max_counter>.到標準輸出.
第二個是啟動器腳本.它在后臺啟動3個loop.sh腳本并顯示其退出狀態:
#!/bin/bash
handle_chld() {
local tmp=()
for i in ${!pids[@]}; do
if [ ! -d /proc/${pids[i]} ]; then
wait ${pids[i]}
echo "Stopped ${pids[i]}; exit code: $?"
unset pids[i]
fi
done
}
set -o monitor
trap "handle_chld" CHLD
# Start background processes
./loop.sh 3 &
pids+=($!)
./loop.sh 2 &
pids+=($!)
./loop.sh -x &
pids+=($!)
# Wait until all background processes are stopped
while [ ${#pids[@]} -gt 0 ]; do echo "WAITING FOR: ${pids[@]}"; sleep 2; done
echo STOPPED
handle_chld函數將處理SIGCHLD信號.通過設置選項監視器,可以使非交互式腳本接收SIGCHLD.然后將陷阱設置為SIGCHLD信號.
然后啟動后臺進程.它們的所有PID都被記住在pids數組中.如果收到SIGCHLD,則在/ proc /目錄中檢查停止了哪個子進程(缺少的子進程)(也可以使用內置的kill -0< PID> bash進行檢查).等待之后,后臺進程的退出狀態存儲在著名的$?中.偽變量.
主腳本等待所有pid停止(否則它無法獲取其子級的退出狀態),并且它自身停止.
輸出示例:
WAITING FOR: 13102 13103 13104
SLEEPING [13103]: 1/2
SLEEPING [13102]: 1/3
Stopped 13104; exit code: 1
WAITING FOR: 13102 13103
WAITING FOR: 13102 13103
SLEEPING [13103]: 2/2
SLEEPING [13102]: 2/3
WAITING FOR: 13102 13103
WAITING FOR: 13102 13103
SLEEPING [13102]: 3/3
Stopped 13103; exit code: 0
WAITING FOR: 13102
WAITING FOR: 13102
WAITING FOR: 13102
Stopped 13102; exit code: 0
STOPPED
可以看出,退出代碼已正確報告.
我希望這可以有所幫助!
標簽:bash,linux,bash,bash,bash
來源: https://codeday.me/bug/20191029/1956947.html
總結
以上是生活随笔為你收集整理的linux脚本登录启动失败,linux-从bash脚本启动进程失败的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux命令去除重复的值,学习linu
- 下一篇: linux脚本判断流程控制,Shell