2013-10-11 18 views
6

Próbuję powiedzieć Bashowi, poczekaj na rozpoczęcie/rozpoczęcie procesu. Próbuję w ten sposób na przykład:Bash poczekaj na rozpoczęcie procesu

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 

dobrze mam pytania następujące:

  1. dlaczego ten wygeneruje plik o nazwie „0" (plik są puste) ja nie chcę Zrób nowy plik, po prostu poczekaj, aż PID sprawdzi wykonanie.

  2. To jest pętla, ale jeśli 2 polecenia są wykonywane poprawnie, 1 raz jak mogę to kontynuować?

  3. Do tego lepszego wykorzystania "aż do"?

  4. Kolejne pomysły na proces oczekiwania Rozpocznij lub rozpocznij?

Odpowiedz

2

Aby odpowiedzieć na pierwsze pytanie: ">" nie jest operatorem matematycznym/porównawczym "większym niż"; jest to sposób basha pozwalający ci wyprowadzić wyjście do pliku (uchwytu).

echo "some text" > myfile.txt 

utworzy plik o nazwie myfile.txt i „>” wysłał wyjściowe polecenia do tego pliku. Wyobrażam sobie, że twój plik "0" ma w sobie pid i nic więcej.

Zamiast próbować -gt (lub związanych warianty: -ge, -lt, -le, -eg, -ne), aby sprawdzić, czy jedna wartość jest większa niż (czyli większy niż lub równy, mniejszy, mniejszy lub równy, równy, nie równe, odpowiednio), aby zobaczyć, czy to pomaga. Oznacza to, że

until [ $notepad -gt 0 ] 
+0

Dziękuję, ale zapomniałem o tym i ">>" są za ??? – inukaze

+1

'>' zapisuje do pliku.Jeśli plik istnieje, zostanie nadpisany. '>>' dołącza do końca pliku; jeśli plik jeszcze nie istnieje, zostanie utworzony. '>' może usuwać dane, '>>' nie. – dangenet

14

Istnieje wiele problemów z kodem:

  1. pidof nie drukuje 0 lub -1 jeśli nie ma proces, więc logika jest błędna
  2. pidof może powrócić do samodzielnego pids, jeśli istnieje wiele procesów, które mogłyby naruszyć twoje porównanie:
  3. > musi być zmienione w [ ] w przeciwnym razie twój kod jest równoważny [ $notepad ] > 0, kierując go do pliku.
  4. > nie jest nawet właściwym operatorem. Chciałeś -gt, ale jak wspomniano w punkcie 1 i 2, nie powinieneś porównywać liczb.
  5. until uruchamia pętlę, dopóki warunek nie jest spełniony. nie czeka na spełnienie warunku, a następnie uruchamia pętlę.

Jest to, jak należy to zrobić:

# 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

możesz mi wytłumaczyć lub podać link z eksplikacji jaki sposób ów wiersz 1 - PID = (pidof notesy) ok zmiennych PID = Niektóre cały numer 2 - dla PID w $ PID dlaczego PID? w $ pids są zmienne, ale nie podaję się "pid" to robi nową zmienność ??? – inukaze

+0

'pids = $ (pidof notepad)' staje się 'pids =" 14436 16690 19023 "' (lub może po prostu 'pids =" 14436 "' jeśli jest tylko jeden uruchomiony notatnik). W pętli for pętli każdy z tych liczb w '$ pids'. Za każdym razem, gdy pętla się uruchamia, '$ pid' będzie inną wartością z listy w' $ pids', więc za pierwszym razem będzie to 14436, następnym razem 16690, itd. –

1

Jeśli dobrze rozumiem, chcesz czekać aż schowek jest uruchomiona. Następnie pidof musi być w twojej pętli.

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

Pomysł, naprawdę, kiedy zestaw zadań & renice, są stosowane, wyjdź z pętli, aby kontynuować skrypt. Nie wiem, czy dobrze jest użyć przerwy, czy kontynuować. – inukaze

Powiązane problemy