Ich möchte einen Prozess wie einen Daemon aus einem Skript ausführen und konfigurieren.
Meine Shell ist unter Cygwin zsh emuliert und der Daemon ist SFK , ein einfacher FTP-Server.
Für das, was hier zählt, kann das Skript startserv.sh
wie folgt verfasst werden:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Nachdem das Skript ausgeführt wurde startserv.sh
, wird es angehalten (beendet?), Ohne dass eine Eingabeaufforderung angezeigt wird.
CTRL+ Cbeendet sowohl das Skript als auch den Hintergrundjobprozess;
Wenn Sie Enterdas Skript beenden, bleibt der Vorgang im Hintergrund.
Wie auch immer, ich kann es nur über ps
und nicht über sehen. jobs
Wenn ich den Vorgang abschließen möchte, muss ich ein brutales kill -9
Signal senden , was ich zu Gunsten von CTRL+ vermeiden möchte C.
Eine Alternative wäre, das gesamte Skript im Hintergrund auszuführen. 'Wäre', aber der read
Befehl kann die Benutzereingabe nicht abrufen, wenn das Skript ausgeführt wird als startserv.sh &
.
Beachten Sie, dass ich einen kurzlebigen Server benötige, keinen echten Daemon . Das heißt, dass der Serverprozess nach dem Ende des Skripts im Hintergrund ausgeführt werden soll, um einfache interaktive Shell-Aufgaben (mit einem Gast einer virtuellen Maschine) auszuführen. Ich brauche den Prozess, um die Hülle zu überleben. nohup
scheint daher nicht angebracht.
bgproc="$!"
undcommand "$bgproc"
ergreifen Sie dann die entsprechende Aktion. Siehe auch stackoverflow.com/questions/1908610/…Antworten:
Fast! Tatsächlich wurde das Skript bereits beendet, als Sie auf drücken Enter. Auf diese Weise können Sie jedoch Ihre Eingabeaufforderung zurückerhalten (da Ihre Shell erneut druckt
$PS1
).Der Grund, warum das Drücken von Ctrl+ Cbeide beendet, ist, dass die beiden verknüpft sind. Wenn Sie Ihr Skript ausführen, initiiert Ihre Shell eine Subshell, in der Sie es ausführen können. Wenn Sie diese Subshell beenden, stirbt Ihr Hintergrundprozess wahrscheinlich aufgrund eines
SIGHUP
Signals ab.Trennen Sie das Skript, den Hintergrundprozess und die Subshell
Mit
nohup
können Sie diese kleine Unannehmlichkeit vielleicht loswerden.Die
disown
AlternativeWenn Sie von
/bin/sh
nach wechseln können/bin/bash
, können Sie es auch versuchendisown
. Um mehr zu erfahren, geben Sie einfachhelp disown
einebash
Instanz ein.Den Hintergrundprozess "schön" beenden
Nun, wenn es darum geht, Ihren Prozess zu beenden, können Sie perfekt ein " Ctrl+ C" verwenden
kill
. Senden Sie einfach keine brutalenSIGKILL
. Stattdessen können Sie Folgendes verwenden:Welches wird ein nettes
SIGINT
(2) oderSIGTERM
(15) an Ihren Prozess senden . Sie können den PID-Wert auch drucken, nachdem Sie den Vorgang gestartet haben:... oder noch besser, lassen Sie das Skript auf ein warten
SIGINT
und senden Sie es zurück an den Hintergrundprozess (dies wird Ihr Skript jedoch im Vordergrund halten) :Wenn a
SIGINT
nicht ausreicht, verwenden SieSIGTERM
stattdessen einfach a (15):Wenn Ihr Skript für den Hintergrundprozess ein
SIGINT
( Ctrl+ C,kill -2
) oder eineSIGTERM
Weile empfängt ,wait
leitet es die Signale einfach an das Skript weiter . Wenn diese Signale diesfk
Instanzwait
beenden, kehrt der Aufruf zurück und beendet daher auch Ihr Skript :)quelle
jobs
im Terminal ausgegeben werden, nachdem das Skript beendet wurde (anstattps
).pid -p
) problemlos Informationen darüber erhalten können .wait
) nie ausgeführt . Wenn Sie das Warten