Asynchronní příkaz v shellovém skriptu

Asynchronní příkaz v shellovém skriptu
« kdy: 19. 08. 2021, 22:14:22 »
Zdravim
potreboval bych poradit s 'asynchronni' radkou ve skriptu.
Mam skript, ktery mi "zapne port - pocka  - vypne port". Ale ta doba cekani muze byt volitelna az nekolik minut a ja potrebuju, aby skript hned dobehl a vratil mi nejake navratove hodnoty.

Kód: [Vybrat]
#!/bin/sh
VALUE=60
DEVICE=12
IP=192.168.111.90

#tato radka by mela bezet nezavisle na behu skriptu
(curl --silent $IP/?switchOn%$DEVICE  ; sleep $VALUE ;  curl --silent $IP/?switchOff%$DEVICE ) &

STATUS=`curl --silent $IP/?get `;
echo "$STATUS";

Zkousel jsem syntaxi (.....) & ale stejne skript ceka, az ta radka probehne.

Diky za radu.
« Poslední změna: 20. 08. 2021, 09:52:30 od Petr Krčmář »


ZAJDAN

  • *****
  • 2 078
    • Zobrazit profil
    • E-mail
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Asynchronni prikaz v shell skriptu
« Odpověď #2 kdy: 20. 08. 2021, 08:47:17 »
Mně to nečeká.
Kód: [Vybrat]
$ cat bgtest.sh
#!/bin/sh
echo start
(date; sleep 2; date) &
echo end
$ ./bgtest.sh
start
end
$ Pá srp 20 08:44:55 CEST 2021
Pá srp 20 08:44:57 CEST 2021

Re:Asynchronní příkaz v shellovém skriptu
« Odpověď #3 kdy: 26. 08. 2021, 22:21:34 »
Predne se musim omluvit - pri pokladani dotazu jsem neuvedl, ze se jedna o CGI skript volany pres Apache.

Proto nemohu pouzit "$ myscript &" podle stackoverflow.

Zkousel jsem 'bgtest.sh' a funguje mi take spravne z prikazove radky, ale pokud podobny kod pouziju do CGI skriptu, tak webova stranka vrati vysledek az po ukonceni prikazu sleep 10
start
end
Fri Aug 20 15:44:18 CEST 2021
Fri Aug 20 15:44:28 CEST 2021


Stejne tak skript ceka i na dokonceni jednoho prikazu bez zavorek, takze pokud tam vlozim 'sleep 20 &' tak webova stranka se obnovi az po 20 vterinach.(nezalezi zda je vykonavan jeden nebo vice prikazu)

Diky za napad nebo komentar.

_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Asynchronní příkaz v shellovém skriptu
« Odpověď #4 kdy: 26. 08. 2021, 22:54:40 »
Zkus v tom skriptu spustit "screen -d -m /muj/skript/na/pozadi.sh". Ale jinak obecně jsou to nějaké ty věci ohledně process groups a asi by bylo lepší napsat démona co poběží nezávisle a CGI ho jenom ovládat (volat z CGI "echo zapni | nc 127.0.0.1 1234").


tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Asynchronní příkaz v shellovém skriptu
« Odpověď #5 kdy: 27. 08. 2021, 03:33:44 »
Já bych tipnul, že to čte výstup toho skriptu dokud se stdin/out nezavře a jak podprocesy ty deskriptory dědí, tak se zavřou až když všechny procesy skončí. Takže bych zkusil toto:
Kód: [Vybrat]
prikaz </dev/null &>/dev/null &

Re:Asynchronní příkaz v shellovém skriptu
« Odpověď #6 kdy: 27. 08. 2021, 06:35:59 »
Než použít screen, je lepší použít nohup

Zkus v tom skriptu spustit "screen -d -m /muj/skript/na/pozadi.sh". Ale jinak obecně jsou to nějaké ty věci ohledně process groups a asi by bylo lepší napsat démona co poběží nezávisle a CGI ho jenom ovládat (volat z CGI "echo zapni | nc 127.0.0.1 1234").


Re:Asynchronní příkaz v shellovém skriptu
« Odpověď #7 kdy: 28. 08. 2021, 14:50:34 »
"screen -d -m /muj/skript/na/pozadi.sh" funguje presne podle potreby!!!!

Zkousel jsem i 'nohup' ale bez vysledku.

Diky moc za pomoc.
« Poslední změna: 28. 08. 2021, 14:56:20 od ejencik »