Jak sprawdzić, czy proces już działa, czy nie

32

Chcę sprawdzić, czy dany proces jest już uruchomiony, czy nie.

Odniosłem się do tego pytania i odpowiedzi .

Ale nie dostałem żadnego konkretnego rozwiązania. Oto przykład, który próbowałem: utworzyłem abc.shplik i uruchomiłem ten skrypt w tle, na przykład sh abc.sh &.

Teraz ten plik działa w tle i uruchamiam ps aux | grep "abc"polecenie.

Poniżej przedstawiono wynik działania tego polecenia:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Następnie zatrzymuję abc.shuruchomiony skrypt i uruchamiam to samo ps aux | grep "abc"polecenie.

Ale otrzymuję takie same wyniki, jak:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Czy jest jakiś inny sposób na sprawdzenie, czy proces jest uruchomiony, czy nie?

Prakash V Holkar
źródło

Odpowiedzi:

41

Każdy proces będzie wymieniony w wynikach ps aux; czy bieganie, spanie, zombie lub zatrzymany.

Jednak w twoim przypadku, ponieważ proces został uruchomiony przy użyciu sh abc.sh, shaplikacja (powłoka) jest uruchomiona i nie abc.sh. Dlatego ps auxnie będzie zawierać procesu, z abc.shpowodu którego grepnie może przynieść żadnego wyniku.

Prawidłowy sposób, w jaki powinieneś był go użyć, to:

ps aux | grep sh

Może to również zwrócić ci inny proces, który ma łańcuch w shdowolnym miejscu na wyjściu ps aux.

Należy zauważyć, że proces będzie „działał”, gdy wynik ps auxma wartość STATas R. Jeśli jest to coś innego, to nie działa w instancji, w której uruchomiłeś polecenie, aby sprawdzić uruchomione procesy. Różne stany procesu można znaleźć na stronie podręcznika dla ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Równie dobrze możesz uruchomić toppolecenie, aby sprawdzić, czy proces działa, czy śpi i ile procesora i pamięci RAM zużywa. (To ponownie wyświetli listę Twojego procesu jako sh).

Jeśli jednak chcesz, aby proces był wymieniony jako abc.sh, to powinieneś mieć pierwszą linię skryptu, który uruchamiasz jako:

#!/bin/sh

aby powłoka wiedziała, jakiej aplikacji użyć do uruchomienia skryptu (w tym przypadku sh, zmień ją #!/bin/bashna bash), a następnie zapewnij uprawnienia do wykonywania procesu, używając:

chmod +x /path/to/abc.sh

zamieniając /path/to/na lokalizację abc.shpliku, a następnie uruchom abc.shza pomocą

/path/to/abc.sh

ponownie zastępując /path/to/lokalizację abc.shpliku.

Praca w
źródło
2
Jedno szybkie pytanie. co jest stat S+środki
Prakash V Holkar
Różnicę między uruchomionymi procesami a ich brakiem można znaleźć w danych wyjściowych ps aux | grep filenamepolecenia.
Avinash Raj
@TechGuru: Oznacza to, że proces śpi na pierwszym planie, więcej informacji znajduje się na stronie instrukcji ps.
Jobin
@AvinashRaj: Tak, oczywiście, że możesz.
Jobin
Pojawia
IgorGanapolsky
7

Mój problem greppolega na tym, że jest to parser całej linii. W twoim przykładzie szukasz „abc”, ale odsuwa ono instancję grep(która szuka „abc”). Trochę okrągły. Możesz to odfiltrować, ale uważam, że to wszystko jest trochę przewrotne.

Chciałbym zwrócić się awkdo trochę polotu.

ps aux | awk '$12=="abc.sh"'

awkdzieli linie na pola na podstawie białych znaków (domyślnie). Pola 11 $ + są kolumnami poleceń, więc jeśli polecenie brzmi „sh abc.sh ...”, $11będzie shi $12będzie abc.sh.

Jeśli chcesz kontrolować wyjście lub łańcuch za pomocą Basha &&i ||operatorów, możesz, ale musisz być trochę bardziej sprytny. grepwyjdzie z kodem stanu 1 (błąd techniczny, wyzwala ||), jeśli nic nie zostanie znalezione, ale awkzawsze wyjdzie z kodu 0. Możemy to zmienić, każąc mu wyjść, jeśli coś znajdzie, i rzucić 1, jeśli nie:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Oczywiście, jeśli zależy ci tylko na zapisie wyników na ekranie, możesz to wszystko zrobić w awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
Oli
źródło
4

Właściwym sposobem sprawdzenia w bieżącej sesji bash, czy proces rozpoczęty w tle, na przykład sh abc.sh &, jest już uruchomiony, czy nie, to użycie jobswbudowanej komendy.

Przykład:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Oznacza to, że sh abc.shproces rozpoczęty w tle jest uruchomiony. Po zakończeniu procesu zobaczysz coś takiego:

[1]+  Done                    sh abc.sh

Jeśli w tle działa więcej procesów, możesz ograniczyć dane wyjściowe tylko do sh abc.shprocesu, używając:

jobs sh

Zobacz help jobswięcej informacji.

Powyższa metoda będzie działać tylko w bieżącej sesji bash. Ale jeśli uczestniczysz w innej sesji bash (np. W innym oknie lub karcie terminala lub w skrypcie), oprócz:

ps aux | grep "[s]h bin/test.sh"

możesz użyć również:

pgrep -a sh

co wydaje mi się prostsze. Jeśli zobaczysz wpisane polecenie w danych wyjściowych ( sh abc.shw tym przypadku), oznacza to, że proces jest nadal uruchomiony. Jeśli nie, proces się zakończył.

Radu Rădeanu
źródło
3

Jeśli skrypt jest obecnie uruchomiony, musi zostać wyświetlony za pomocą ps auxpolecenia. Jeśli nie zostanie to pokazane przez ps, oznacza to, że wykonanie skryptu jest obecnie zakończone.

Wynik pstego typu oznacza, że ​​skrypt nie jest aktualnie uruchomiony,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Jeśli pokazuje się tak, oznacza to, że skrypt jest obecnie uruchomiony.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Wszystko opiera się na treści skryptu.

Na przykład, jeśli utworzysz taki skrypt. Wyświetla komunikat HI podczas wykonywania. Wyświetlenie danych wyjściowych zajmuje kilka sekund i zostało zakończone po uzyskaniu ostatecznego wyniku.

#!/bin/bash
echo "HI"

Ale jeśli taki skrypt jest taki,

#!/bin/bash
sudo apt-get update

Zakończenie procesu zajmuje kilka minut. Tymczasem jeśli uruchomisz ps aux | grep filenamepolecenie, zostanie wyświetlone na wyjściu. Ponieważ skrypt jest obecnie uruchomiony.

Avinash Raj
źródło
-2
  • jeśli chcesz sprawdzić wszystkie procesy, użyj „góra”

  • jeśli chcesz poznać procesy uruchamiane przez java, użyj ps -ef | grep java

  • jeśli inny proces, po prostu użyj ps -ef | grep xyzlub po prostu/etc/init.d xyz status

  • jeśli przez jakikolwiek kod jak .shwtedy./xyz.sh status

Umman
źródło
1
-1 Chociaż te polecenia są przydatne w niektórych okolicznościach, nadal będą bezużyteczne dla kogoś, kto nie zna tych okoliczności. W każdym przypadku albo nie wyjaśniasz ich wystarczająco, albo twoje wyjaśnienie jest błędne.
David Foerster
-2

jeśli chcesz po prostu sprawdzić, czy proces nie jest przetwarzany, przejdź do tego katalogu i wpisz ll -tr, .csvczy .workna końcu pliku widzisz itd.

Umman
źródło
Ta odpowiedź nie ma sensu. Wyświetlanie zawartości katalogu nie powie ci, czy proces jest uruchomiony. Rozszerzenie pliku .csvdotyczy plików rozdzielanych przecinkami, które nie są związane z uruchomionym procesem.
user369450,