Vraag Hoe u kunt controleren of het proces al actief is of niet


Ik wil het betreffende proces controleren of het al actief is of niet.

Ik heb gerefereerd deze Q & A.

Maar ik kreeg geen specifieke oplossing. Hierna volgt het voorbeeld dat ik probeerde: ik heb gemaakt abc.sh bestand en voer dit script uit op de achtergrond, zoals sh abc.sh &.

Nu draait dit bestand op de achtergrond en ik vuur de ps aux | grep "abc" opdracht.

Het volgende is de uitvoer van deze opdracht:

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

Daarna stop ik de abc.sh script uitvoeren en hetzelfde commando activeren ps aux | grep "abc" opdracht.

Maar ik krijg dezelfde uitvoer als:

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

Is er een andere manier om te ontdekken dat het proces actief is of niet?


27
2018-05-29 11:21


oorsprong




antwoorden:


Elk proces wordt vermeld in de uitvoer van ps aux; of rennen, slapen, zombie of gestopt.

In uw geval echter, omdat u het proces hebt uitgevoerd met sh abc.sh, sh is de applicatie (shell) die draait en niet abc.sh. Vandaar, ps aux zal het proces niet bevatten abc.sh waardoor grep kon geen enkel resultaat opleveren.

Dus, de juiste manier waarop je het zou moeten gebruiken is als:

ps aux | grep sh

Dit kan ook andere processen die met de string worden uitgevoerd, teruggeven sh overal in hun output van ps aux.

Merk op dat het proces "loopt" wanneer de uitvoer van ps aux heeft zijn STAT als R. Als het iets anders is dan dat, wordt het niet uitgevoerd op de instantie die u de opdracht hebt gegeven om de lopende processen te controleren. De verschillende processtatussen zijn te vinden op de man-pagina voor 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

Je kunt net zo goed het top commando om te controleren of het proces draait of slaapt en hoeveel CPU, RAM het verbruikt. (Hiermee wordt uw proces opnieuw als weergegeven sh).

Als u echter wilt dat uw proces wordt weergegeven als abc.sh, dan zou je de eerste regel van het script moeten hebben als:

#!/bin/sh

zodat de shell weet welke applicatie moet worden gebruikt om het script uit te voeren (sh in dit geval, verander het in #!/bin/bash voor bash) en geef vervolgens uitvoerbare machtigingen voor het proces met behulp van:

chmod +x /path/to/abc.sh

vervangen /path/to/ met de locatie van de abc.sh bestand en voer het uit abc.sh gebruik makend van

/path/to/abc.sh

opnieuw aan het vervangen /path/to/ met de locatie van de abc.sh het dossier.


36
2018-05-29 11:53



Een snelle vraag. wat is stat S+ middelen - Prakash V Holkar
Maar u kunt het verschil vinden tussen actieve processen en geen actieve processen via de uitvoer van ps aux | grep filename opdracht. - Avinash Raj
@TechGuru: Dit betekent dat het proces op de voorgrond slaapt, raadpleeg de handleidingpagina van ps voor meer informatie. - jobin
@AvinashRaj: Ja, dat kan natuurlijk. - jobin
Ik krijg een foutmelding: Fout, doe dit: mount -t proc proc / proc - Igor G.


Mijn probleem met grep is dat het een volledige parser is. In uw voorbeeld zoekt u naar "abc" maar het trekt de instantie terug van grep (dat zoekt naar "abc"). Een beetje rond. Je kunt dat filteren maar ik vind dat allemaal een beetje pervers.

Ik zou terugkeren awk voor een beetje zwier.

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

awk splitst de lijnen in velden op basis van witruimte (standaard). Velden $ 11 + zijn de opdrachtkolom (men), dus als het commando "sh abc.sh ..." is, $11 zal zijn sh en $12 zal zijn abc.sh.

Als je de output of ketting met Bash's wilt regelen && en || operatoren, dat kan, maar u zult een beetje slimmer moeten zijn. grep zal afsluiten met statuscode 1 (technisch falen, triggers ||) als er niets is gevonden maar awk zal altijd code 0 afsluiten. We kunnen dit veranderen door het te laten stoppen als het iets vindt en een 1 gooit als het dat niet doet:

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

Natuurlijk, als je alleen maar geeft om de uitvoer naar het scherm te schrijven, zou je dat allemaal kunnen doen awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'

6
2018-05-29 20:13





De juiste manier om in de huidige bash-sessie te controleren of een proces is gestart op de achtergrond, zoals sh abc.sh &, is al actief of niet is te gebruiken jobs ingebouwde opdracht.

Voorbeeld:

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

Dat betekent dat de sh abc.sh het proces dat op de achtergrond is gestart, draait. Als het proces is voltooid, ziet u iets als:

[1]+  Done                    sh abc.sh

Als u meer processen op de achtergrond uitvoert, kunt u de uitvoer alleen beperken tot de sh abc.sh proces met behulp van:

jobs sh

Zien help jobs voor meer informatie.

De bovenstaande methode werkt alleen in de huidige sessie van bash. Maar als u zich in een andere bash-sessie bevindt (bijvoorbeeld in een ander terminalvenster of -tabblad of in een script), naast:

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

je kunt ook gebruiken:

pgrep -a sh

dat lijkt me eenvoudiger. Als u uw getypte opdracht in de uitvoer ziet (sh abc.sh in dit geval), betekent dit dat het proces nog steeds loopt. Als dit niet het geval is, is het proces voltooid.


4
2018-05-29 17:52





Als uw script momenteel wordt uitgevoerd, moet dit worden weergegeven door ps aux opdracht. Als het niet wordt getoond door ps, dan is uw scriptuitvoer mogelijk beëindigd.

Output van ps zoals dit betekent dat je script momenteel niet draait,

$ 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

Als het zo wordt weergegeven, betekent dit dat uw script momenteel wordt uitgevoerd.

$ 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

Het is allemaal gebaseerd op de inhoud van het script.

Bijvoorbeeld als u een script zoals dit maakt. Het toont het bericht HI bij uitvoering. Het duurt een paar seconden om de uitvoer weer te geven en is geëindigd nadat deze het eindresultaat heeft geproduceerd.

#!/bin/bash
echo "HI"

Maar als je script zo is,

#!/bin/bash
sudo apt-get update

Het duurt enkele minuten om het proces te beëindigen. In de tussentijd als je rent ps aux | grep filename opdracht wordt weergegeven op de uitvoer. Omdat het script momenteel wordt uitgevoerd.


3
2018-05-29 11:33





als je gewoon wilt controleren of er een onder-proces is, ga dan naar die map en typ ll -tr als je het ziet .csv of .work enz. aan het einde van het bestand, dan betekent dit onder proces anders niet.


0
2018-05-23 20:16





  • als u alle processen wilt controleren, gebruikt u 'top'

  • als je wilt weten welke processen worden uitgevoerd door Java, gebruik dan ps -ef | grep java

  • als een ander proces dan gewoon gebruikt ps -ef | grep xyz of gewoon /etc/init.d xyz status

  • als via welke code dan ook .sh dan ./xyz.sh status


-1
2018-05-23 19:55



-1 Hoewel deze commando's onder bepaalde omstandigheden nuttig zijn, zullen ze nog steeds nutteloos zijn voor iemand die deze omstandigheden niet kent. In beide gevallen legt u ze niet voldoende uit of is uw uitleg onjuist. - David Foerster