2010-08-31 30 views
3

我已經編寫了一個腳本,它依賴於其他服務器響應(使用wget來提取數據),並且我希望它始終在背景中運行,無疑是毫無疑問的。我知道一個解決方案就是寫一個包裝腳本,它會通過追加'&'來調用我的腳本,但我想避免這種混亂。Shell腳本可以檢查它是否在調用時是背景的

是否有方法讓bash(或zsh)腳本確定是否使用./foo.sh &來調用它,如果不是,退出並重新啓動它本身?

謝謝大家!

回答

1

我不知道,如何做到這一點,但您可以在父腳本設置變量和孩子檢查它:無論是在bash和zsh中

if [[ -z "$_BACKGROUNDED" ]] ; then 
    _BACKGROUNDED=1 exec $0 [email protected] & exit 
fi 
# Put code here 

作品。

+0

我打算接受這個答案,它似乎是做我想做的,除非你的解決方案「endif」應該是「fi」;-)非常感謝。 – jparanich 2010-08-31 22:13:19

+0

額外的想法:我意識到一個挑剔的人可能會認爲這個snipplet將重新啓動腳本,即使在調用後臺,但檢查這個額外的複雜性不是我需要的。 – jparanich 2010-08-31 22:20:27

-2

很久以前我沒有寫shell腳本,但我可以給你一個很好的主意(我希望)。您可以檢查$$的值(這是進程的PID),並與命令「jobs -l」的輸出進行比較。這最後一個命令將返回所有後臺進程(作業)的PID,並且如果$$值包含在「jobs -l」的結果中,則表示當前腳本正在後臺運行。

+0

'jobs -l'無法訪問父進程的作業列表,請檢查'zsh -c'作業的輸出-l; echo $$;睡眠1s'&':除了'$$'外,它什麼也不會回聲。 – ZyX 2010-08-31 16:36:53

+0

我寫了一個小小的shell腳本來測試我所說的,並且我編寫了作業-l和echo $$。當我用fg運行我的腳本時,沒有&當然沒有工作-l沒有返回任何內容,但是當我在bg中運行時,它返回相同的$$ ...我正在使用bash – carlson 2010-08-31 17:46:41

+1

如何運行腳本?我沒有在bash和zsh中看到這種行爲。 – ZyX 2010-08-31 18:06:01

7

後臺進程的定義(我認爲)是它有一個控制終端,但它不是該終端的前臺進程組的一部分。我認爲任何shell,甚至zsh,都不允許你通過內置的方式訪問這些信息。

在Linux(也許還有其他unices)上,當進程是其終端的前臺進程組的一部分時,STAT列的ps包括+。所以文字回答你的問題是,你可以把一個main功能腳本的內容,並調用它:

case $(ps -o stat= -p $$) in 
    *+*) main "[email protected]" &;; 
    *) main "[email protected]";; 
esac 

但你不妨運行main "[email protected]" &反正。在Unix上,fork很便宜。

但是,我強烈建議不要做你的建議。這使得人們無法運行腳本並在事後做其他事情 - 人們希望能夠編寫your_script; my_postprocessingyour_script && my_postprocessing,但是分叉​​腳本的主要任務使得這不可能。考慮到在腳本被調用時增益偶爾會保存一個字符,這樣做不足以使腳本顯得不那麼有用。

如果你真的意味着腳本在後臺運行,這樣用戶可以關閉自己的終端,你需要做更多的工作 - 你需要守護進程的腳本,它不僅包括backgrounding還要關閉終端打開的所有文件描述符,使該進程成爲會話的領導者等等。我認爲這需要將你的腳本分成一個守護程序包裝腳本和一個主腳本。但是,守護進程通常是爲永遠不會終止的程序完成的,除非明確停止,這不是您所描述的行爲。

+0

嗨吉爾斯,感謝您的詳細回覆。你提供的解決方案與ZyX一起工作,但我接受他,因爲它更獨立,不依賴於ps或任何分支。爲了記錄,該腳本僅供我自己使用,永遠不會被其他用戶觸及,並位於/etc/init.d中,因此它不會終止關閉。謝謝=)+1 – jparanich 2010-08-31 22:16:33

1

如果您處於後臺,「tty」命令會顯示「not a tty」,或者如果您處於前臺,則會顯示控制終端名稱(例如/ dev/pts/1)。一個簡單的方法來告訴。

+0

這似乎不是我的情況:調用'tty'的shell腳本爲我返回一個終端,無論我是在前臺調用腳本還是在末尾放置一個'&的。 – Smylers 2013-09-11 15:35:06

相關問題