Wie lösche ich eine Datei aus einem Befehl in einer Shell-Datei für /etc/init.d?

963
CaesarS

Ich habe eine Frage zum Thema /etc/init.dShell.

Alles was ich tun möchte ist, eine Datei aus einem Befehl im Shellskript zu löschen:

case $1 in  stop) echo "Stopping" rm -f /var/run/memcached/memcached.pid  esac 

Ich speichere es als Test und erstelle die memcached.pidDatei.

Wenn ich /etc/init.d/teststop mit dem Skript aus dem /etc/init.d/Ordner starte, wird die memcached.pidDatei nicht gelöscht.

Wenn ich das Skript von meinem Home-Verzeichnis aus ausführe, funktioniert es einwandfrei.

Gibt es ein spezielles Format oder eine Struktur des Befehls, die benötigt wird?

2
Ein solcher Befehl sollte funktionieren. Besonders bei einer PID-Datei, die `init.d`-Skripte ohnehin normalerweise löschen. Da Sie jedoch nur einen kleinen Teil Ihres Skripts anzeigen, ist es schwer zu sagen, ob der Befehl nicht durch etwas anderes verschluckt wird. Eine Idee ist, führen Sie den Befehl als "root" oder über "sudo" aus? Ich würde auch empfehlen, [dieses nette grundlegende `init.d`-Beispiel] (http://werxltd.com/wp/2012/01/05/simple-init-d-script-template/) auszuprobieren und ob dies der Fall ist hilft dir. JakeGould vor 7 Jahren 0
Ich führe den Befehl als sudo so aus: sudo /etc/init.d/test stop. Vielen Dank für den Link zu Beispielen! CaesarS vor 7 Jahren 0

1 Antwort auf die Frage

2
Argonauts

Verwenden Sie den vollständigen Pfad zu rm. Vergewissern Sie sich, dass es auf Ihrem System gleich ist:

 /usr/bin/rm -f /var/run/memcached/memcached.pid 

Für Init-Skripts ist normalerweise keine (oder Root-) PATH-Umgebungsvariable festgelegt.

Ich habe das Miniskript wie Sie geändert und die PID-Datei wird immer noch nicht gelöscht. Das ist wirklich seltsam. Da ist nichts vor, das Snippet ist das Testskript. CaesarS vor 7 Jahren 0
Haben Sie den Pfad zu rm bestätigt? Verwenden Sie den Befehl which rm, um den Pfad abzurufen Argonauts vor 7 Jahren 0
Wenn Sie den richtigen Pfad haben, fügen Sie den folgenden Befehl vor dem Befehl rm hinzu. Zuerst den Pfad zu diesem Programm bestätigen. / usr / bin / chmod u + w /var/run/memcached/memcached.pid Um die Ausgabe jedes Befehls weiter zu debuggen, fügen Sie am Ende jedes Befehls die folgende Zeile hinzu: >> /var/logs/initlog.log 2 > & 1 Argonauts vor 7 Jahren 0
Dann überprüfen Sie diese Datei natürlich nach der Ausführung Argonauts vor 7 Jahren 0
Ja, ich habe den richtigen Pfad mit allen hart codierten Pfaden bestätigt. Versuchen Sie jetzt das Debug-Protokoll. CaesarS vor 7 Jahren 0
Das Debug-Protokoll hat keine Datei ergeben. CaesarS vor 7 Jahren 0
Ich habe es geschafft, so zu arbeiten, dass ich nicht sicher bin, was sich von meinem kleinen Testskript unterscheidet, mit dem ich angefangen habe :-) PIDFILE = "/ var / run / memcached / memcached.pid" printf "% s \ n" $ PIDFILE case $ 1 in stop) echo "Stoppen" rm -f $ PIDFILE esac printf "% s \ n" $ PIDFILE CaesarS vor 7 Jahren 0
Ich habe die Besonderheit der Zeile mit # isoliert. / lib / lsb / init-Funktionen oben im eigentlichen Skript und auskommentiert. Das Skript verhält sich wie ein normales Bash-Skript. Ich bin sicher, dass es etwas Wichtiges tut. Ich werde es später recherchieren. CaesarS vor 7 Jahren 0
das . / lib / lsb / init-functions hat versucht, eine allgemeine "Bibliothek" zu beschaffen, die in init.d-Scripts verwendet werden muss. Es ist sehr wahrscheinlich, dass Sie diese (oder zumindest an diesem Ort) und diese Zeile nicht installiert haben verursachte einen Fehler Normalerweise würde ein Fehler nicht dazu führen, dass die nächsten Zeilen in einem normalen Bash-Skript fehlschlagen, es sei denn, Sie hätten "-e" oder "#! / Bin / bash -e" im Skript (oder möglicherweise im übergeordneten Init-Skript) nennt dieses eine); Dieses Flag bewirkt, dass ein Skript die Ausführung beim ersten Auftreten eines Fehlers beendet. Und das würde erklären, warum keine Protokolldateien erstellt wurden - so weit ist es nie gekommen. Argonauts vor 7 Jahren 0