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
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.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 november ' 10 om 14:28echo $!
my-app & myVar=$! ; fg
.fg
brengt het proces weer op de voorgrond. Ik kan danecho $myVar
later afdrukken en ik ' ben er vrij zeker van dat de mijn-app al klaar is.