Chci mít takový skript:
my-app & echo $my-app-pid
Ale mám nevím, jak získat pid právě provedeného příkazu.
Vím, že stačí použít příkaz jobs -p my-app
k grepování pid. Ale pokud chci spustit shell několikrát, tato metoda nebude fungovat. Protože jobspec je nejednoznačný.
Odpověď
Odpověď
Získejte PID
:
#!/bin/bash my-app & echo $!
Uložit PID
do proměnné:
#!/bin/bash my-app & export APP_PID=$!
Uložit všechny instance PID
v textovém souboru:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
Uložit výstup, chyby a PID
do samostatných souborů :
#!/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)"
Komentáře
- Otázka nebyla ' t požádat o přesměrování, pak je vaše odpověď většinou stejná jako přijatá, kromě toho, že pokud instance
my-app
skončí a možná ještě horší bude její PID znovu použit později, vy ' Ve vašem souboru budou špatné informace. Nemyslím si ' že tato odpověď přidává velkou hodnotu stávající přijaté odpovědi opravdu - příspěvek @EricRenouf aktualizován!
- další derivát, který může být užitečné. Tím se získá PID a zároveň se s ním zachází jako s (většinou) procesem v popředí:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - není APP =
main &
způsob, jak získat PID?
odpověď
Zkuste něco podobného
pidof my_app >> /tmp/my_app.pid
Komentáře
- externí příkaz a pomalý, pokud systém může dát PID přímo, proč prohledávat všechny procesy a najít právě to ? a také si můžete ' být jisti, že ' získáte správnou hodnotu
Odpověď
Zkuste něco podobného:
ps ef | grep "[m]y-app" | awk "{print $2}"
Umístěte první písmeno svého procesu mezi [
]
zajistí, že ve vašem seznamu nedostanete grep
proces. V případě potřeby můžete ke svému uživatelskému jménu přidat také grep.
Komentáře
- To je ' velmi v nejlepším případě křehký a nefunguje ', pokud je
my-app
spuštěn vícekrát – davidshen84 se toho konkrétně obává cas. - Pokud se dokonce vydáte touto cestou, měli byste místo toho použít
pgrep
.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24. listopadu ' 10 v 14:28echo $!
my-app & myVar=$! ; fg
.fg
přináší proces znovu do popředí. Poté mohuecho $myVar
vytisknout později a jsem si ' docela jistý, že moje aplikace již byla hotová.