防止shell腳本長時間執行致使ssh超時

在一些對安全性要求較高的場景下。ssh的超時時間是管理員預先設置好的,在閒置一段時間後ssh鏈接會本身主動斷開。

這樣的狀況下假設經過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

相關文章
相關標籤/搜索