Chciałbym uruchomić i skonfigurować proces podobnie do demona ze skryptu.
Moja powłoka jest emulowana zsh pod Cygwin, a demonem jest SFK , podstawowy serwer FTP.
Dla tego, co jest ważne, skrypt startserv.sh
można napisać w następujący sposób:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Po uruchomieniu skryptu startserv.sh
zatrzymuje się (kończy?) Bez wyświetlania monitu, a następnie:
CTRL+ Ckończy zarówno proces skryptu, jak i proces zadania w tle;
Naciśnięcie Enterskryptu kończy proces pozostaje w tle.
W każdym razie widzę to tylko przez, ps
a nie jobs
, więc kiedy chcę zakończyć proces, muszę wysłać brutalny kill -9
sygnał, czego chciałbym uniknąć na korzyść CTRL+ C.
Alternatywą byłoby uruchomienie całego skryptu w tle. „Byłoby”, ale read
polecenie nie może uzyskać danych wejściowych użytkownika, jeśli skrypt jest uruchamiany jako startserv.sh &
.
Zauważ, że potrzebuję efemerycznego serwera, a nie prawdziwego demona : chcę, aby proces serwera działał w tle, po zakończeniu skryptu, aby wykonywać proste zadania powłoki interaktywnej (z gościem maszyny wirtualnej), ale nie „ potrzebuje procesu, aby przetrwać pocisk; dlatego nohup
wydaje się niewłaściwe.
bgproc="$!"
a następniecommand "$bgproc"
wykonaj odpowiednie działanie. Zobacz także stackoverflow.com/questions/1908610/…Odpowiedzi:
Prawie! W rzeczywistości skrypt został już zakończony do momentu naciśnięcia Enter. Jednak w ten sposób możesz odzyskać swój monit (ponieważ twoja powłoka drukuje
$PS1
go od nowa).Powodem, dla którego wciśnięcie Ctrl+ Ckończy oba z nich, jest to, że oba są ze sobą powiązane. Podczas wykonywania skryptu powłoka inicjuje podpowłokę, w której ma zostać uruchomiony. Po zakończeniu tej podpowłoki proces w tle umiera, prawdopodobnie z powodu
SIGHUP
sygnału.Oddziel skrypt, proces w tle i podpowłokę
Używając
nohup
, możesz pozbyć się tej małej niedogodności.disown
alternatywaJeśli możesz przełączyć się z
/bin/sh
na/bin/bash
, możesz spróbowaćdisown
również. Aby dowiedzieć się więcej, wystarczy wpisaćhelp disown
wbash
instancji.„Ładne” zabicie procesu w tle
Teraz, jeśli chodzi o zabicie twojego procesu, możesz doskonale zrobić „ Ctrl+ C” używając
kill
. Tylko nie wysyłaj brutalnegoSIGKILL
. Zamiast tego możesz użyć:Który wyśle miły
SIGINT
(2) lubSIGTERM
(15) do twojego procesu. Możesz także wydrukować wartość PID po rozpoczęciu procesu:... lub jeszcze lepiej, poczekaj na skrypt
SIGINT
i odeślij go z powrotem do procesu w tle (spowoduje to, że skrypt będzie na pierwszym planie) :Jeśli
SIGINT
to nie wystarczy, użyjSIGTERM
zamiast tego (15):W ten sposób, gdy twój skrypt odbierze
SIGINT
( Ctrl+ C,kill -2
) lub jakiśSIGTERM
czaswait
na proces w tle, po prostu przekaże mu sygnały. Jeśli te sygnały zabijąsfk
instancję, wówczaswait
wywołanie zostanie zwrócone, co spowoduje zakończenie również skryptu :)źródło
jobs
w terminalu po zakończeniu skryptu (zamiastps
).pid -p
).wait
). Jeśli usuniesz oczekiwanie, obsługa sygnału zostanie zerwana: /