Warum läuft ein Shutdown-Skript NICHT?

1872
marekful

Ich habe ein Shutdown-Skript auf einem Ubuntu-System installiert, das nicht ausgeführt wird. Es ist eine Amazon EC2-Instanz. Ich bin nicht sicher, ob es mit dieser Tatsache zu tun hat, wollte ich nur darauf hinweisen.

Das Skript sollte einige Protokolldateien in einen Amazon S3-Bucket übertragen, sodass es ausgeführt werden muss, während das Netzwerk aktiv ist.

So habe ich das Skript installiert:

1) Erstellt die Datei /etc/init.d/push-apache-logs-to-s3.shmit den erforderlichen Befehlen.

2) Mit ausführbar gemacht sudo chmod +x push-apache-logs-to-s3.sh

3) ausgeführt sudo update-rc.d push-apache-logs-to-s3.sh start 0 0 .

Ausgabe von oben war:

update-rc.d: warning: /etc/init.d/push-apache-logs-to-s3.sh missing LSB information update-rc.d: see <http://wiki.debian.org/LSBInitScripts> Adding system startup for /etc/init.d/push-apache-logs-to-s3.sh ... /etc/rc0.d/S00push-apache-logs-to-s3.sh -> ../init.d/push-apache-logs-to-s3.sh 

Der Inhalt von /etc/rc0.d/ist jetzt:

lrwxrwxrwx 1 root root 17 Jul 31 2012 K09apache2 -> ../init.d/apache2 lrwxrwxrwx 1 root root 29 Jun 16 2012 K10unattended-upgrades -> ../init.d/unattended-upgrades lrwxrwxrwx 1 root root 26 Jun 16 2012 K15landscape-client -> ../init.d/landscape-client lrwxrwxrwx 1 root root 19 Apr 10 11:11 K20memcached -> ../init.d/memcached -rw-r--r-- 1 root root 353 Jul 26 2012 README lrwxrwxrwx 1 root root 35 Jul 10 12:01 S00push-apache-logs-to-s3.sh -> ../init.d/push-apache-logs-to-s3.sh lrwxrwxrwx 1 root root 18 Jun 16 2012 S20sendsigs -> ../init.d/sendsigs lrwxrwxrwx 1 root root 17 Jun 16 2012 S30urandom -> ../init.d/urandom lrwxrwxrwx 1 root root 22 Jun 16 2012 S31umountnfs.sh -> ../init.d/umountnfs.sh lrwxrwxrwx 1 root root 20 Jun 16 2012 S35networking -> ../init.d/networking lrwxrwxrwx 1 root root 18 Jun 16 2012 S40umountfs -> ../init.d/umountfs lrwxrwxrwx 1 root root 20 Jun 16 2012 S60umountroot -> ../init.d/umountroot lrwxrwxrwx 1 root root 14 Jun 16 2012 S90halt -> ../init.d/halt 

Wenn ich das Skript manuell ausführe sudo ./push-apache-logs-to-s3.sh, erledigt es die beabsichtigte Arbeit.

Werden diese Skripte von ausgeführt root? Was vermisse ich?

2
Diese Art von Problemen wird normalerweise dadurch verursacht, dass in den Umgebungsvariablen etwas fehlt, wenn sie nicht interaktiv ausgeführt werden. Ich gehe davon aus, dass Sie die Vorsichtsmaßnahme getroffen haben, um relative Pfade in Ihren Skripts nicht zu verwenden, so dass möglicherweise eine Abhängigkeit von einer Umgebungsvariablen besteht, die nicht verfügbar ist. Könnten Sie das Skript Ihrer Frage hinzufügen? GnP vor 10 Jahren 1
@gnp Ich habe dazu eine weitere Frage mit mehr Details und dem Skriptinhalt gepostet. Bitte überprüfen Sie es hier: http://superuser.com/questions/617957/lsb-init-script-not-executed marekful vor 10 Jahren 0
Ich glaube ich habe jetzt was falsch gemacht. `s3cmd` wurde unter einem anderen Benutzer als 'root' konfiguriert, daher kann das von` root` ausgeführte Init-Skript den Befehl `s3cmd` nicht ausführen. Ich versuche es unter dem root-Benutzer zu konfigurieren und zu sehen, ob das hilft. marekful vor 10 Jahren 0
Nein, das hat nicht geholfen. Wenn ich das Skript mit einem der beiden Benutzer ausführte, macht es das, was s3cmd tun soll, und kann auf seine Konfiguration zugreifen. Offenbar wird das Init-Skript beim Herunterfahren anscheinend nicht ausgeführt ... marekful vor 10 Jahren 0

3 Antworten auf die Frage

1
terdon

Was ist das erwartete Verhalten, wenn Sie das Skript so einstellen, dass es ausgeführt wird S00? Ich habe keine Skripte S00auf meinem System. Kann es sein, dass mindestens 1 erforderlich ist? Sie haben auch nicht explizit Start / Stopp festgelegt, was möglicherweise Probleme verursacht. Nur für den Fall, versuchen Sie es

sudo update-rc.d push-apache-logs-to-s3.sh start 01 2 3 4 5 . stop 01 0 1 6 . 

Wenn das immer noch nicht funktioniert, aktualisieren Sie bitte Ihre Frage, an wen Ihr Skript (oder zumindest die Kopfzeilen) gerichtet ist, da möglicherweise etwas nicht stimmt.


BEARBEITEN

Nachdem Sie das Skript, das Sie in Ihrer anderen Frage gepostet haben, gesehen haben, sehe ich zwei mögliche Probleme. Zuerst haben Sie ein Leerzeichen in Ihrer Shebang-Linie !# /bin/shanstatt #!/bin/sh.

Noch wichtiger ist, warum verwenden Sie shstatt bash? shunterstützt nicht source, geschweige denn .als Alias ​​für source. Ändern Sie Ihr Skript bashstattdessen mit, damit sollte es behoben werden. In der Tat verstehe ich nicht, warum es funktioniert, wenn Sie es manuell ausführen, das .sollte einen Fehler auslösen:

$ sh $ source foo sh: 1: source: not found $ bash $ source foo bash: foo: No such file or directory 

Scratch das, ich habe mich geirrt, wie @gnp darauf hinweist, dashtatsächlich unterstützt ..

Ich habe deinen Vorschlag ausprobiert, aber immer noch kein Glück. Jetzt habe ich das Skript in /etc/init.d/ so geändert, dass es wie alle anderen zu einem richtigen LSB-Skript wird. Wird immer noch nicht angerufen ... marekful vor 10 Jahren 0
@ MarcellFülöp und `/ etc / init.d / push-apache-logs-to-s3.sh` gehört root, oder? terdon vor 10 Jahren 0
Ja, es ist "-rwxr-xr-x 1 root root" marekful vor 10 Jahren 0
Auf den meisten Ubuntu-Systemen ist sh ein Symlink zu bash oder dash `lrwxrwxrwx 1 root root 4 29. März 2012 / bin / sh -> dash`. Auch die meisten Skripte, die ich auf /etc/init.d habe, haben den Platz nach dem Shebang und verwenden sh als Shell. GnP vor 10 Jahren 0
Re: BEARBEITEN. Gute Argumente. In der ersten Version hatte ich `#! / Bin / bash`. Dann habe ich eines der vorhandenen Init-Skripte kopiert und so geändert, dass das `#! / bin / sh` kam von dort, also gehe ich davon aus, dass das in Ordnung ist. Wird versuchen, es wieder in `#! / Bin / bash` zu ändern. marekful vor 10 Jahren 0
@gnp ja, aber "dash" unterstützt "source" oder "." nicht, daher bleibt das Problem bestehen, da das OP eine Datei beschafft. Der Raum scheint tatsächlich irrelevant zu sein. terdon vor 10 Jahren 0
@ MarcellFülöp, weil `.` nicht mit` sh` oder `dash` läuft. terdon vor 10 Jahren 0
@terdon dash unterstützt `.`:` ~ / workspace $ dash $ echo $ a $. / home / gabriel / workspace / testfile $ echo $ a 2 $ ` GnP vor 10 Jahren 0
@gnp Ich stehe korrigiert, also habe ich die Fehlermeldung falsch gelesen. terdon vor 10 Jahren 0
1
GnP

Sie möchten, dass das Skript beim Herunterfahren ausgeführt wird. Ersetzen Sie Start mit Stopp wie folgt:

sudo update-rc.d push-apache-logs-to-s3.sh stop 0 0 . 

Beachten Sie, dass anstelle von S ein K vorangestellt wird

Ich habe das schon früher ausprobiert, aber immer noch kein Anzeichen dafür, dass es ausgeführt wird. marekful vor 10 Jahren 0
Das ist nicht das, was "stop" und "start" tun, sie haben nichts mit dem Herunterfahren zu tun, das durch die angegebenen Runlevel definiert wird. Siehe "man update-rc.d". terdon vor 10 Jahren 0
Sie haben Recht, es wird ausgeführt, wenn auf Runlevel 0 umgeschaltet wird. Beim Anhalten und Starten werden nur die an sie übergebenen Parameter geändert, was im OP-Fall keinen Unterschied macht. GnP vor 10 Jahren 0
Mit "stop" und "start" können Sie festlegen, bei welchen Runlevels sie gestartet und gestoppt werden. "Stop 0 1 6" bedeutet zum Beispiel Stop bei den Runlevels 0,1 und 6. terdon vor 10 Jahren 0
0
marekful

Die Wurzel des Problems ist, dass s3cmddie Konfigurationsdatei nicht gelesen werden kann. Aus irgendeinem Grund, der mir unbekannt ist, während einer Runlevel-Änderung (0), wenn initInit-Scripts ausgeführt werden, wird der rootBenutzer, der diese Scripts ausführt, anscheinend nicht als "echter" Benutzer gezählt, daher hat er kein "Home" -Verzeichnis von wo aus s3cmdversucht die config zu lesen.

Wenn Sie den Speicherort der Konfigurationsdatei explizit angeben, wird --config=...dieses Problem gelöst.

Danke für die Hilfe und den Input von allen!