shell下在while迴圈中使用ssh命令的問題
阿新 • • 發佈:2019-01-07
最近遇到一個很奇怪的問題,產品的某個功能可以根據日誌檔案的異常紀錄,去處理這些異常,不過在測試的時候發現每次都只能處理一條異常,然後整個迴圈就退出了。
開始以為是某個函式裡面呼叫了exit命令,看了一整遍程式碼也沒有發現使用exit的函式。最後只好在while迴圈裡面一點一點的註釋,然後觀察執行結果。最後竟然定位到是在一個函式裡面,呼叫了另外一個shell檔案,而且這個shell檔案裡的某個函式只要一執行,就會導致迴圈退出,然後定位到是一條ssh命令導致的。
搞不通ssh命令為什麼會導致shell退出,最後上網搜了一下才找到答案。
1. ssh命令在每次執行時,會讀取所有的標準輸入中的內容。
2. 對於while迴圈,當按照如下方式使用時:
cat file | while read line
這裡使用重定向,將檔案內容輸入到while命令,while命令每次使用read從輸入中讀取一行資料。
問題就在這裡,如果在while迴圈中呼叫了ssh命令,那麼ssh就會把當前輸入中所有的資料讀走,也就是cat file重定向給while命令的資料,都被ssh命令讀走了,以至於下次迴圈的時候,read讀到的內容為空,導致迴圈提前結束。
解決這個問題兩種方式
1. ssh -n 使用-n引數
2. ssh xxxx < /dev/null重定向shell命令的輸入