Hoe krijg ik de pid van de laatst uitgevoerde opdracht in het shellscript?

Ik wil een shellscript zoals dit:

my-app & echo $my-app-pid 

Maar ik wil weet niet hoe ik de pid van het zojuist uitgevoerde commando kan krijgen.

Ik weet dat ik gewoon het jobs -p my-app commando kan gebruiken om de pid te grepen. Maar als ik de shell meerdere keren wil uitvoeren, zal deze methode niet werken. Omdat de jobspec dubbelzinnig is.

Answer

De PID van het laatst uitgevoerde commando staat in de $! shell-variabele:

my-app & echo $! 

Opmerkingen

  • Het is pid afdrukken zoals voor bijv. [1] 893. Ik wil alleen een nummer.
  • Opgemerkt moet worden dat dit staat voor programmas die op de achtergrond zijn gestart. Als er geen achtergrondprocessen zijn gestart, is de parameter niet ingesteld.
  • Een andere waardige oplossing wordt voorgesteld in (een opmerking op een antwoord op) Hoe pid te krijgen van net gestart proces : oh, en de " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 november ' 10 om 14:28
  • @ user3153014 String s zoals " [2] 2625 " worden afgedrukt door de shell na het starten van de achtergrondtaak. Dit is niet gerelateerd aan de uitvoer van echo $!
  • Ik gebruik dergelijke code meestal in een script als ik moet wachten tot het proces is afgelopen. my-app & myVar=$! ; fg. fg brengt het proces weer op de voorgrond. Ik kan dan echo $myVar later afdrukken en ik ' ben er vrij zeker van dat de mijn-app al klaar is.

Antwoord

Haal PID:

#!/bin/bash my-app & echo $! 

Bewaar PID in variabele:

#!/bin/bash my-app & export APP_PID=$! 

Sla alle instanties op PID in tekstbestand:

#!/bin/bash my-app & echo $! >>/tmp/my-app.pid 

Bewaar uitvoer, fouten en PID in aparte bestanden :

#!/bin/bash my-app >/tmp/my-app.log 2>/tmp/my-app.error.log & echo $! >>/tmp/my-app.pid echo "my-app PID"s: $(cat /tmp/my-app.pid)" 

Reacties

  • De vraag heeft ' vraag je niet naar omleiding, dan is je antwoord grotendeels hetzelfde als het geaccepteerde antwoord, behalve dat als een instantie van my-app klaar is, en misschien nog erger, de PID later opnieuw wordt gebruikt, je ' Ik zal slechte informatie in uw bestand hebben. Ik denk niet ' niet dat dit antwoord echt veel waarde toevoegt aan het bestaande geaccepteerde antwoord
  • @EricRenouf bericht bijgewerkt!
  • een andere afgeleide die kan nuttig zijn. Dit haalt de PID op en behandelt het tegelijkertijd als een (meestal) voorgrondproces: sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & een manier om PID te bemachtigen?

Antwoord

Probeer zoiets als

pidof my_app >> /tmp/my_app.pid 

Reacties

  • extern commando, en traag, als het systeem PID direct kan geven, waarom dan door alle processen zoeken om precies dat te vinden ? en ook, kan ' er niet zeker van zijn dat u ' de juiste waarde zult krijgen

Antwoord

Probeer zoiets als dit:

 ps ef | grep "[m]y-app" | awk "{print $2}" 

Plaats de eerste letter van uw proces tussen [ ] zorgt ervoor dat u het grep proces niet in uw lijst krijgt. Indien nodig kunt u ook een grep aan uw gebruikersnaam toevoegen.

Opmerkingen

  • Dat ' is erg kwetsbaar op zijn best en ' t werkt niet als my-app meer dan eens wordt uitgevoerd – davidshen84 maakt zich daar specifiek zorgen over cas.
  • Als je zelfs deze route gaat, zou je in plaats daarvan pgrep moeten gebruiken.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *