2016-03-28 56 views
0

所以我有一個shell腳本可以執行一些長操作,並且當他們這樣做時,我只想輸出一系列的點(。)直到完成,以顯示它是運行。Bash:使用pkill來跟蹤刪除目錄的進度

我使用pkill來測試進程正在運行,只要它輸出另一個點。這對我幾乎每個需要它的地方都非常有效。然而,這個過程的一部分涉及到刪除一個目錄,那就是它破壞的地方。

這裏是我的代碼:

ERROR=$(rm -rf "$1" 2>&1 >/dev/null) 
    while pkill -0 rm; do 
     printf "." 
     sleep 1 
    done 
    printf "\n" 

我使用pkill的測試過程RM,但是當我做,這是我的輸出獲得:

pkill: signalling pid 192: Operation not permitted 

pkill: signalling pid 326: Operation not permitted 

.pkill: signalling pid 61: Operation not permitted 

我的腳本運行起來直到包括文件夾刪除在內的點輸出代碼,然後它停止並且只是一遍又一遍地輸出這三行,直到我強行終止進程。

任何人有任何想法是怎麼回事?我覺得它不能與RM運作一起工作,但我不確定。

在此先感謝。

+0

有些進程與'rm'匹配,你沒有權限發送信號。例如。在我的系統上:'pkill -0 rm'給出 'pkill:kill pid 1394失敗:操作不允許'和'ps -aux | grep rm'顯示'dirmngr'('rm'與子串匹配)。 –

回答

2

問題是pkill正在發送kill(PID, SIG_0)爲正則表達式匹配的過程rm。對於某些匹配的進程(由PID顯示),您沒有足夠的權限發送SIG_0以獲取進程狀態。

您可以使用-x--exact)選項(無正則表達式)只匹配過程(ES)有確切的名字rm(假定沒有rm其他用戶運行):

pkill -0 -x rm 

或使用pgrep

pgrep -x rm 

更好提到您的用戶名:

pkill -0 -x -u username rm 
pgrep -x -u username rm 
+0

這是偉大的,除了確切的標誌的位置。它應該是pkill -0 -u用戶名-x rm。這對我有用 – user2223059

+0

@ user2223059哎呀..你說的對,信號應該是在第一..我已經從頭..寫..它.. – heemayl

0

您的腳本不會將rm置於後臺,因此當pkill運行時,大概是找到其他用戶擁有的進程,並且無法殺死它們,因爲除非您是root用戶,否則無法殺死其他用戶的進程。

因爲你是在產卵腳本中的過程中,如果你正確的背景rm那麼你可以從$!得到rm作業的PID,並使用kill代替pkill

您應該運行rm命令並正確地將其背景化。下面未經測試的代碼應該做你想做什麼:

rm -rf "$1" >/dev/null 2>&1 & 
RMPID=$! 
while kill -0 $RMPID 2>/dev/null; do 
    printf "." 
    sleep 1 
done 
printf "\n" 
wait $RMPID 
RESULT=$? 
if (($RESULT != 0)); then 
    printf "Error when deleting $1\n" 
    exit 1 
fi 

你可以閱讀更多細節bash的文件上wait$!$?

+0

我最初嘗試使用殺死這個,但我永遠不能得到它正常工作。 pkill爲我工作,所以這就是爲什麼我跑它。按照你在這裏的指示,我殺了一會兒,但是在循環結束後,它在輸出幾次後給我一個「沒有這樣的過程」的錯誤。 – user2223059

+0

另外,這種方式的輸出似乎對我很好。我還是比較新的shell腳本,但重定向2>&1已經得到了錯誤輸出,> ​​/ dev/null已經發送了所有其他輸出。這已經成功地爲我在我的代碼中的其他幾個地方工作。 – user2223059

+0

你說得對,重定向的順序很重要,如果顛倒了我的評論,它們就會適用。 – Julian