2016-11-10 69 views
1

我想檢查是否有錯誤的最後一條命令,因此將stderr重定向到一個文件並檢查文件中的「錯誤」字符串(只有一個可能的。錯誤在這種情況下)bash:腳本看到的重定向文件'不存在'

我的腳本看起來像下面:

#aquire lock 

rm -f /some/path/err.out 
MyProgramme 2>/some/path/err.out & 

if grep -i "error" /some/path/err.out ; then 
    echo "ERROR while running MyProgramme, check /some/path/err.out for error(s)" 
    #release lock   
    exit 1 
fi 

「如果」條件是給錯誤的err.out「沒有這樣的文件或目錄」,不過,我可以看到該文件存在。

我錯過了什麼嗎?..任何幫助表示讚賞。謝謝!

PS:我無法使用$檢查退出代碼?因爲它在後臺運行。

回答

-1

當你在後臺啓動MyProgramme,它可能是grep執行之前MyProgramme可以寫(並由此創建)的文件/some/path/err.out。這就是爲什麼即使文件稍後在您自己檢查時存在,grep也找不到它。

在使用grep檢查文件之前,您可以使用wait等到後臺作業完成。

+0

感謝您的回答。這裏的程序運行永無止境。除了等待以外的其他方式? – Srikanth

+2

嗯我可能是錯的,但我認爲'>'導致文件被立即創建/截斷? –

+0

@Srikanth如果程序永遠不會結束,那麼您怎麼知道它在哪一點打印「錯誤」?你想等多久?如果「err」文件不存在,您是否要立即退出腳本?我的意思是如果程序永遠運行或很長一段時間,那麼不應該檢查是否在最後或至少定期發生錯誤。 –

0

除了在撥打grep時可能不存在的文件之外,您只能撥打grep一次,它只能看到文件中當前的任何數據。 grep在文件到達結束時不會繼續讀取,等待MyProgramme完成。相反,我會建議使用命名管道作爲grep的輸入。這將導致grep繼續從管道讀取,直到MyProgramme確實完成。

#aquire lock 

rm -f /some/path/err.out 
p=/some/path/err.out 
mkfifo "$p" 
MyProgramme 2> "$p" & 


if grep -i "error" "$p" ; then 
    echo "ERROR while running MyProgramme, check /some/path/err.out for error(s)" 
    #release lock   
    exit 
fi