Jak získat pid posledního provedeného příkazu ve skriptu shellu?

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ěď

PID posledního provedeného příkazu je v $! proměnná prostředí:

my-app & echo $! 

Komentáře

  • Tiskne pid jako např. [1] 893. Chci pouze číslo.
  • Je třeba poznamenat, že to znamená programy spuštěné na pozadí . Pokud nebyly spuštěny žádné procesy na pozadí, parametr není nastaven.
  • Další vhodné řešení je navrženo v (komentář k odpovědi) Jak získat pid právě spuštěného procesu : oh, a " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24. listopadu ' 10 v 14:28
  • @ user3153014 Řetězce jako " [2] 2625 " jsou po spuštění úlohy na pozadí vytištěny pomocí shellu. To nesouvisí s výstupem echo $!
  • Obvykle takový kód používám ve skriptu, když potřebuji počkat, až proces skončí. my-app & myVar=$! ; fg. fg přináší proces znovu do popředí. Poté mohu echo $myVar vytisknout později a jsem si ' docela jistý, že moje aplikace již byla hotová.

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *