這樣的狀況下假設經過ssh運行腳本,而腳本運行時間又比較長的話。會致使sshclient和server長時間無交互而超時,命令運行失敗。安全
使用bash子進程可以解決這樣的問題,思路是由子進程運行詳細的邏輯代碼,而由主進程來監控子進程的運行狀態,同一時候向控制檯輸出字符來keep alive。
bash建立子進程有多重方式。這裏使用「()」,而後用「&」將其放在後臺運行。儘管經過「job -p」能夠獲取到後臺進程的進程ID並使用「wait $PID」的方式能夠監控到子進程的返回狀態,如如下的代碼。但這樣的方式至關於堵塞了主進程,沒法運行其它動做。
bash
for pid in $(jobs -p); do wait $pid done解決的方法是新建一個標誌文件,並將子進程返回值保存在另一個暫時文件裏,主進程經過標誌文件和返回值來獲取相關信息。運行其他邏輯。
簡化代碼例如如下,主進程在等待時會一直打印一個旋轉的進度標誌。
ssh
function doSomething() { local retTmp=$(mktemp) local lock="/tmp/do.lock" touch $lock ( real script to do something echo $?> $retTmp rm -f $lock; )& while [ -f $lock ]; do sleep 0.1 printf "Please wait... %s \r" $f let "t=10#$(date +%N) / 100000000 % 4" case $t in 0) f="/";; 1) f="-";; 2) f="\\";; 3) f="|";; esac done echo local retcode=$(cat $retTmp) rm -f $retTmp return $retcode }函數
這樣的方式相似於經過fork函數實現相關邏輯,感受上略微有點笨重,不清楚bash是否有更簡便的方式來實現主子進程的信息同步code