Käynnistä taustaprosessi ja tarkista, kun se päättyy.

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

  • Tämän hyöty: se EI PALAA keskusyksikköä aikaa äärettömän silmukan kanssa, joka käy koko ajan ….;)
  • Tämän haittana on, että et voi ' tehdä mitään muuta odottaessasi , kuten edistymisen osoittaminen käyttäjälle. Vain cuonglm ' -sovelluksen avulla voit tehdä tämän.
  • @Mark Booth Voit osoittavat edistymistä kolmannen asynkronisen työn kanssa. esim .: cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;

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 osoitteeseen nohup.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 tiedostoon nohup.out, ja tämä ajatus ei mene mihinkään nopeasti. (3) Vaikka command kirjoittaisi lähdön, miten voit selvittää, milloin se loppuu seuraamalla tuotosta?
  • @ G- Mies ehkä tarkistamalla lsof -lähdön, onko nohup edelleen nohup.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 osoitteeseen nohup.out. (5) Kyllä, voit kirjoittaa komentosarjan komentosarjan ja suorittaa lsof nähdäksesi, onko nohup.out vielä auki. Mutta se olisi erilainen vastaus. (6) Vaikka tekisitkin niin, se olisi epäluotettava. Entä jos jokin muu prosessi avaa nohup.out -tiedoston? Haluat todella tarkistaa, oliko tässä prosessissa nohup.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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *