Kuinka voin käynnistää prosessin taustalla ja tarkistaa, kun se päättyy bash-komentosarjassa? Ajatukseni on tällainen komentosarja:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Vastaa
Avain on ”wait” -komento:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
kommentit
Vastaa
Kanssa wait
voit saada tarvitsemasi tarkkuuden:
sleep 1 & PID1=$! sleep 2 & PID2=$! wait $PID1 echo "PID1 has ended." wait echo "All background processes have exited."
vastaus
Tässä on yksi tapa tehdä se:
launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" exit 0
kommentit
- kiitos, tämä on ehdottomasti ainoa vastaus, joka vastaa alkuperäisen kysymykseni tulkintaan (ja miksi päädyin tarkastelemaan tätä kysymystä)
- @cuonglm, Mitä prosesseja on useita? Luultavasti
wait
sopii siihen paremmin? - @cuonglm mitä -0-tapa tappaa komento tekee
- @k_vishwanath se ilmoittaa onko prosessi on edelleen käynnissä tai ei.
Vastaa
Voit suorittaa prosessisi nohupilla ja kirjoittaa luettavaksi komentosarjan. nohup.out-tiedosto, jota nohup käyttää kirjautuessaan.
nohup command &
Kommentit
- (1) karvojen halkeamisen vaara,
nohup
ei ' kirjoita mitään osoitteeseennohup.out
; se vain luo tiedoston ja ohjaa komennon lähdön siihen. (2) Jos komento ' ei tuota mitään lähtöä, mitään ei kirjoiteta tiedostoonnohup.out
, ja tämä ajatus ei mene mihinkään nopeasti. (3) Vaikkacommand
kirjoittaisi lähdön, miten voit selvittää, milloin se loppuu seuraamalla tuotosta? - @ G- Mies ehkä tarkistamalla
lsof
-lähdön, onkonohup
edelleennohup.out
, mutta olen samaa mieltä siitä, että tämä on erittäin karvainen menetelmä. - (4) Siihen mennessä, kun
command
alkaa toimia,nohup
on kadonnut. (1) Kyllä, toistan numeron, koska toistan sen, mitä sanoin kaksi vuotta sitten:nohup
ei kirjoita mitään osoitteeseennohup.out
. (5) Kyllä, voit kirjoittaa komentosarjan komentosarjan ja suorittaalsof
nähdäksesi, onkonohup.out
vielä auki. Mutta se olisi erilainen vastaus. (6) Vaikka tekisitkin niin, se olisi epäluotettava. Entä jos jokin muu prosessi avaanohup.out
-tiedoston? Haluat todella tarkistaa, oliko tässä prosessissanohup.out
auki. (7) Mutta jos aiot tehdä niin, miksi et vain tarkista onko prosessi käynnissä?
Vastaa
wait
toimii vain lapsiprosessissa, joka käynnistetään samassa kuoressa; se on loppujen lopuksi kuoritoiminto.
Kaikissa mielivaltaisissa taustaprosesseissa on työskenneltävä PID: n kanssa. Kukaan täällä ei mainitse ytimen PID-kierrätystä . Nykyaikaiset Linux-järjestelmät voivat käyttää PID: tä usein kuormituksesta riippuen. Tarvitset muutakin kuin PID-tunnistetta prosessin luotettavaan tunnistamiseen. Yksi yksinkertainen tapa on säästää aikaa kun prosessi alkoi ja vertaa sitä säännöllisesti nykyiseen prosessin alkamisaikaan. Jos PID kierrätetään, sen alkamisaika ei ole sama.
Prosessin alkamisaika ilmoitetaan kentässä 22 kentässä / proc / [pid] / stat -tiedosto. Aika mitataan jiffeissä (enintään 10 ms), mikä antaa tarpeeksi tarkkuus prosessitunnusten kierrätyksen havaitsemiseksi.
PID=<process ID> START_TIME=$(cut -d " " -f 22 /proc/$PID/stat) while [ "$(cut -d " " -f 22 /proc/$PID/stat 2>/dev/null)" = "$START_TIME" ]; do echo "PROCESS IS RUNNING" sleep 1 done
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;