27
maja
2009
Dzisiaj będzie krótka programistyczno-uniksowa zagadka
Jak mając jeden skrypt w bashu sprawić, aby wykonał on najpierw jakieś operacje interaktywne, np. pobiera dane od użytkownika, operuje na jakiś plikach, a następnie w połowie sam przeszedł do działania w tło (np. parsując długo jakiś tekst)?
Nagroda nie jest przewidziana, ale satysfakcja zawsze
Powodzenia!
№ 1
27 maja 2009, 23:01:15
Michał Górny
Użycie funkcji się liczy?
Tak, można używać funkcje.
Skrypt może składać się z dwóch części, wybór części zależny jest na przykład od obecności parametru.
Wpierw więc wywołujemy sobie ./skrypt.sh, a potem skrypt sam uruchamia siebie w tle:
./shrypt.sh bgmode=1 &
a pozostała część się kończy normalnie.
Well, ‘bg’?
№ 5
27 maja 2009, 23:16:57
Michał Górny
@Worm: That won’t work, Sir.
W momencie, gdzie ma przejść w tło robisz całość jako funkcję, np:
#!/bin/sh read a ( sleep 10 echo $a ) &
Swoją drogą, tu nie można śledzić wątku?
Rozwiązanie moje to drugi skrypt uruchamiany w ostatniej linijce z backgroundową częścią zadania.
Ale rozwiązanie Michała z nawiasami i potem & wygląda mi idealnie. :-)
A może macie jeszcez trzecią drogę?
Trzecia droga? Można np. tak:
#!/bin/sh
read a
wieder(){
sleep 2
echo $a
}
wieder &
Problemy z zaliczeniem?
BP, NMSP
Nie, ot takie zadanie, które pojawiło się mojemu koledze na drodze do zaliczenia Systemów Operacyjnych na PG.
Jej, to u nas na PG są teraz takie ambitne zadania? Ja to pisałem skrypt konfiguracyjny do cdlinuksa…
Na zaocznych 4ty semestr z ETI kolega miał taki problem.
o ile sie nie myle:
jesli jest zadeklarowana jkas funckja to mozna ja odpalic z „nohup”.
bash -c „exec nohup setsid komenda”
oczywiscie zapomnialem o przekierowanu wyjscia ;)
bash -c „exec nohup setsid komenda” > /dev/null 2>&1 &
Fajne to z wywołaniem funkcji plus `ampersand`... Niewiedziałem, że
tak można.