2016-02-04 57 views
0

我得到了一個需要很長時間才能運行的腳本,因爲它必須處理成千上萬的文件。我想盡可能使這個腳本儘可能的簡單。爲此,我想檢查用戶是否使用nohup和'&'來運行腳本。 E.x. [email protected]:/home/me/bin $ nohup doAlotOfStuff.sh &。我想100%確定腳本是用nohup和'&'運行的,因爲如果腳本因爲任何原因死在中間,那麼它的恢復過程非常痛苦。如何判斷一個腳本是否在後臺運行並使用nohup?

如何檢查腳本本身內的兩個關鍵參數?如果它們丟失了,我怎麼能在腳本變得更遠之前停止腳本,並向用戶抱怨他們錯誤地運行腳本?更好的是,我可以強制腳本在nohup &中運行嗎?

編輯:服務器enviornment是AIX 7.1

+0

請問爲什麼不使用'screen'或'tmux'? –

+1

它們基本上是終端複用器。他們讓您在遠程計算機(或本地計算機)中打開分離的會話。我強烈建議使用其中之一。 「屏幕」更簡單,而「tmux」的功率更大。 –

+0

嘿,我不小心刪除了我以前的評論。這些命令在AIX中不起作用,這是我的服務器環境。另外,我覺得這不是解決問題的根本原因。我想這樣做,即使最愚蠢的用戶不能混淆腳本= = – R4F6

回答

1

ps實用程序可以獲取進程狀態。在前臺運行時,進程狀態代碼將包含字符+。缺少+意味着代碼正在後臺運行。

但是,很難判斷是否使用nohup來調用後臺腳本。依靠nohup.out的存在幾乎是不可能的,因爲輸出可以被用戶隨意地重定向。

有兩種方法可以完成你想要做的事情。要麼撤出並警告用戶,要麼在後臺自動重啓腳本。

#!/bin/bash 
local mypid=$$ 
if [[ $(ps -o stat= -p $mypid) =~ "+" ]]; then 
    echo Running in foreground. 
    exec nohup $0 "[email protected]" & 
    exit 
fi 
# the rest of the script 
... 

在這段代碼,如果該進程有一個狀態代碼+,它會打印一個警告,然後重新啓動後臺進程。如果這個過程是在後臺開始的,它將繼續執行其餘的代碼。

如果您更喜歡救助並警告用戶,您可以刪除exec線。請注意,在exec後不需要。我留在那裏以防萬一您選擇刪除exec行。

+0

您認爲哪兩種方式最爲可取? – R4F6

+0

如果不希望用戶運行輸出重定向到'/ dev/null'或其他文件爲'doAlotOfStuff.sh>/dev/null 2>&1'的命令,並且不知道它實際上是保留的直到第二天當他們檢查重定向輸出時,最好在後臺自動重啓。 – alvits

1

一個很好的方式找到一個腳本是否被記錄到NOHUP,是首先檢查的nohup.out存在,然後呼應它,並確保你可以在那裏閱讀。例如:

echo "complextag" 
if ($(cat nohup.out | grep "complextag") != "complextag");then 
    # various commands complaining to the user, then exiting 
fi 

這工作,因爲如果腳本的stdout是要的nohup.out,他們應該去(或任何出的文件指定),那麼當你呼應這句話,它應該被追加到文件nohup.out。如果它沒有出現在那裏,那麼腳本就會使用nohup來運行,並且可以通過在臨時廣播文件上使用掛接命令來對它們進行斥責。 (如果你想讓我詳細說明我可以)。

至於在後臺運行,如果它沒有運行,你應該通過檢查nohup來知道。

相關問題