2013-10-11 137 views
6

我想對Bash說,等待進程啓動/開始。我如想通過這種方式:Bash等待進程啓動

notepad=`pidof notepad.exe` 
    until [ $notepad > 0 ] 
     do 
      taskset -p 03 $notepad 
      renice -n 5 -p $notepad 
      sleep 5 
      renice -n 0 -p $notepad 
     done 

以及我有後續問題:

  1. 爲什麼這個生成一個名爲「0「(該文件是空的) 我不想創建一個新文件,只需等待PID檢查執行。

  2. 這是一個循環,但如果2個命令執行correclty,1次 我怎麼能繼續做?

  3. 爲此更好地使用「直到或同時」?

  4. 等待的另一個想法過程開始或開始?

回答

2

要回答你的第一個問題:'>'不是數學/比較運算符大於';這是bash的方式,讓你輸出到文件(句柄)。

echo "some text" > myfile.txt 

將創建一個名爲myfile.txt的文件,'>'將命令的輸出發送到該文件中。我會想象你的文件'0'有它的pid,沒有別的。

相反,嘗試-gt(或相關的變體:-ge-lt-le-eg-ne)來測試一個值是否超過(或更高:大於或等於,小於,小於或等於,等於,不相等),看看是否有幫助。也就是說,

until [ $notepad -gt 0 ] 
+0

謝謝,但我忘記了,而「>>」是爲? – inukaze

+1

'>'寫入文件。如果文件存在,它將被覆蓋。 '>>'追加到文件的末尾;如果該文件尚不存在,則會創建該文件。 '>'可以刪除數據,'>>'不。 – dangenet

14

有你的代碼中的多個問題:

  1. 的pidof不打印0或-1,如果沒有處理,所以你的邏輯是錯誤的
  2. 的pidof可以返回多個pids如果有多個進程,這將打破你的比較
  3. >必須在[ ]中轉義,否則你的代碼相當於[ $notepad ] > 0,指向一個文件。
  4. >甚至不是合適的運營商。你想要-gt,但正如#1和#2中提到的那樣,你不應該比較數字。
  5. until運行循環,直到條件成立。它不會等待條件成爲真,然後運行循環。

這是你應該怎麼做:

# Wait for notepad to start 
until pids=$(pidof notepad) 
do 
    sleep 1 
done 

# Notepad has now started. 

# There could be multiple notepad processes, so loop over the pids 
for pid in $pids 
do   
    taskset -p 03 $pid 
    renice -n 5 -p $pid 
    sleep 5 
    renice -n 0 -p $pid 
done 

# The notepad process(es) have now been handled 
+0

你能解釋一下我或者給一個鏈接以解釋如何如何,多數民衆贊成線 1 - 的PID =(記事本的pidof) 確定變量的PID =某些整個數字 2 - 在$的PID PID 爲什麼PID?在$ pids是變量,但我沒有認識到「pid」這是一個新的變數? – inukaze

+0

'pids = $(pidof notepad)'變成'pids =「14436 16690 19023」'(或者如果只有一個正在運行的記事本,也許只是'pids =「14436」)。使用for循環,可以在'$ pids'中循環每個這些數字。每次循環運行時,'$ pid'將會與'$ pids'中的列表有所不同,因此第一次將是14436,下一次是16690等。 –

1

如果我理解正確的話,你要等到記事本啓動。然後pidof必須在你的循環中。

while ! pidof notepad.exe >> /dev/null ; 
do 
sleep 1 
done 
notepad=$(pidof notepad.exe) 
taskset -p 03 $notepad 
renice -n 5 -p $notepad 
sleep 5 
renice -n 0 -p $notepad 
+0

那麼這個想法,真的是它,當taskset &renice,都適用,請退出循環以繼續執行腳本。 我不知道是否好主意使用中斷或繼續。 – inukaze