Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: ejencik 19. 08. 2021, 22:14:22

Název: Asynchronní příkaz v shellovém skriptu
Přispěvatel: ejencik 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.
Název: Re:Asynchronni prikaz v shell skriptu
Přispěvatel: ZAJDAN 19. 08. 2021, 23:00:53
https://stackoverflow.com/questions/2368137/asynchronous-shell-commands
Název: Re:Asynchronni prikaz v shell skriptu
Přispěvatel: tecka 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
Název: Re:Asynchronní příkaz v shellovém skriptu
Přispěvatel: ejencik 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.
Název: Re:Asynchronní příkaz v shellovém skriptu
Přispěvatel: _Jenda 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").
Název: Re:Asynchronní příkaz v shellovém skriptu
Přispěvatel: tecka 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 &
Název: Re:Asynchronní příkaz v shellovém skriptu
Přispěvatel: Charon351 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").

Název: Re:Asynchronní příkaz v shellovém skriptu
Přispěvatel: ejencik 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.