ubuntuusers.de

Start/Stop Script

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

Nexus1

Anmeldungsdatum:
17. September 2022

Beiträge: 34

Hallo,

nachdem ich jetzt mehrere Stunden vergeblich damit verbracht habe ein Start/Stop Script zu überreden mir eMails zu schicken, frag ich jetzt mal. Aus diesem Thread: https://askubuntu.com/questions/1002808/how-to-send-e-mail-on-startup-on-ubuntu-16-04-lts habe ich das Script übernommen und angepasst.

Momentaner Stand ist dieser:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh
### BEGIN INIT INFO
# Provides:          bootemail
# Required-Start:
# Required-Stop:
# Default-Start:     1 2 3 4 5
# Default-Stop:      0 6
# Short-Description: Send eMail on boot and shutdown
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

case "$1" in
  start|status)
    echo -e "Subject: Message from Server\n\Server is booting" | msmtp adresse@mail.de
    date +"%Y-%m-%d %H:%M:%S   --start" >> /var/log/bootemail.log
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    echo -e "Subject: Message from Server\n\Server is shutting down" | msmtp adresse@mail.de
    date +"%Y-%m-%d %H:%M:%S   --stop" >> /var/log/bootemail.log
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

return 0

Das Script soll beim Booten und beim Shutdown eine eMail per msmpt versenden. Leider funktioniert es nicht. Da ich in /var/log keine Logdatei finden kann nehme ich an das Script wurde noch gar nicht ausgeführt. Wie kann ich den Fehler eingrenzen und das zum Laufen bringen?

msmtp ist eingerichtet. mdadm schickt mir schon eMails zum RAID-Status. System ist Ubuntu Server 22.04, alle Pakete sind auf dem neuesten Stand.

Bearbeitet von ChickenLipsRfun2eat:

Aus dem Spamfilter gefischt.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

das ist: veraltet. Stand der Dinge bei fast allen Linux-Distros ist systemd, welches Units (die wiederum Skripte ausführen können) beim Systemstart und -ende ausführen kann. Einstiegspunkt: systemd

Gruß, noisefloor

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

Hab mich mal grob in systemd eingelesen. Da ich nur einen einzelnen Befehl bei Boot und Shutdown ausführen will, wird es wohl nicht nötig sein eine extra Unit zu erstellen? Ich vermute ich kann das in eine bestehende Unit aufnehmen?

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

Nexus1 schrieb:

Leider funktioniert es nicht. Da ich in /var/log keine Logdatei finden kann nehme ich an das Script wurde noch gar nicht ausgeführt. Wie kann ich den Fehler eingrenzen und das zum Laufen bringen?

Was passiert wenn Du das start-stop-Script manuell ausführst? ... und btw. Du kannst aus einem start-stop-Script auch eine service-unit generieren lassen (... nur so zum Einstieg in sytemd).

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

Im Moment wärs mir am liebsten, schnell das bestehende Script zum Laufen zu bringen und mich später mit systemd zu beschäftigen.

lubux schrieb:

Was passiert wenn Du das start-stop-Script manuell ausführst?

Inzwischen erhalte ich Einträge in das LogFile aber keine eMail. Bei manueller Ausführung das selbe. Läuft msmtp schon wenn das Script ausgeführt wird?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Herzlich willkommen!

Nexus1 schrieb:

Hab mich mal grob in systemd eingelesen. Da ich nur einen einzelnen Befehl bei Boot und Shutdown ausführen will, wird es wohl nicht nötig sein eine extra Unit zu erstellen? Ich vermute ich kann das in eine bestehende Unit aufnehmen?

Die bereits definierten Units sind Teil des Betriebssystems. Daran herumzuschrauben ist keine Gute Idee, weil Deine Änderungen bei Updates dann verloren gehen können. Außerdem verlierst Du die Möglichkeit, Deine Unit unabhängig zu beobachten oder neu zu starten. So schwer ist das nun auch nicht, eine Unit aufzusetzen - zumal Du ja bereits reichlich Anschauungsmaterial auf dem Rechner hast. ☺

Nexus1 schrieb:

Im Moment wärs mir am liebsten, schnell das bestehende Script zum Laufen zu bringen und mich später mit systemd zu beschäftigen.

Dann setzt Du eine Unit auf, die Dein Skript ausführt.

lubux schrieb:

Inzwischen erhalte ich Einträge in das LogFile aber keine eMail. Bei manueller Ausführung das selbe. Läuft msmtp schon wenn das Script ausgeführt wird?

Das musst Du bei Dir auf dem System nachschauen. So etwas musst Du in Deiner Unit als Abhängigkeit definieren.

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

Nexus1 schrieb:

Inzwischen erhalte ich Einträge in das LogFile aber keine eMail. Bei manueller Ausführung das selbe.

Dann schau mal was passiert, wenn Du:

echo -e "Subject: Message from Server\n\Server is booting" | msmtp adresse@mail.de
    date +"%Y-%m-%d %H:%M:%S   --start" >> /var/log/bootemail.log

manuell in der Kommandozeile ausführst. Hast Du msmtp richtig/vollständig konfiguriert? Wenn msmtp in der Kommandozeile richtig funktioniert, dann erst teste das Start-Stop-Script in der Kommandozeile mit:

sudo sh -x /<pfad>/<zum>/<Start-Stop-Script>

Wenn es funktioniert, heißt das noch nicht, dass es auch beim booten funktioniert, weil Du im Script nicht die erforderlichen Abhängigkeiten (bei Required-Start:) eingetragen hast. Eine service-unit könntest Du z. B. mit einer timer-unit so verzögern, bis der Rechner Internetzugang hat und erst dann wird die email gesendet.

Nexus1 schrieb:

Läuft msmtp schon wenn das Script ausgeführt wird?

Ich denke nicht, dass der msmtp (als SMTP client) permanent im Hintergrund aktiv ist und schon vor dem ausführen des Scripts aktiv ist. Das kannst Du aber immer mit z. B.:

ps -fC msmtp
ps aux | grep -i [m]smtp

feststellen.

BTW: Wenn man eine service-unit ändern bzw. ergänzen will (was man für das hier in diesem Thread zu lösende Problem aber nicht machen soll), dann macht man das mit einer oder mehreren drop-in-Datei(en) im richtigen (der service-unit zugeordnetem) Verzeichnis. So gehen die Änderungen/Ergänzungen beim update nicht verloren und es wäre bei generierten service-units auch die einzige sinnvolle Möglichkeit etwas zu ändern/ergänzen (wenn man nicht das "alte"/originale Start-Stop-Script ändern will oder nicht ändern kann).

EDIT:

BTW: Hilfreiche/nützliche Abhängigkeit für eine service-unit, die sofort nach dem booten, Internetzugang herstellen soll bzw. haben soll, sind z. B.:

After=systemd-time-wait-sync.service
Requires=systemd-time-wait-sync.service
Requires=sys-subsystem-net-devices-<wan-Interface>.device
After=sys-subsystem-net-devices-<wan-Interface>.device

, die wenn nicht in der service-unit schon vorhanden, mit Hilfe einer drop-in-Datei in die [Unit]-Section eingetragen/ergänzt werden können.

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

lubux schrieb:

Nexus1 schrieb: Dann schau mal was passiert, wenn Du:

Also das funktioniert an der Konsole, da kommt eine eMail:

echo -e "Subject: Message from Server\n\Server is booting" | msmtp adresse@mail.de

Das hier geht an der Konsole nicht, "permission denied" sogar mit sudo:

date +"%Y-%m-%d %H:%M:%S   --start" >> /var/log/bootemail.log

Wenn ich das Script an der Konsole ausführe bekomme ich einen Logeintrag aber keine eMail.

lubux schrieb:

sudo sh -x /<pfad>/<zum>/<Start-Stop-Script>

Was bedeutet der Parameter -x ?? Mit der Ausgabe kann ich noch nicht viel anfangen:

user@server:/etc/init.d$ sudo sh -x bootemail start
+ PATH=/sbin:/usr/sbin:/bin:/usr/bin
+ . /lib/lsb/init-functions
+ run-parts --lsbsysinit --list /lib/lsb/init-functions.d
+ [ -r /lib/lsb/init-functions.d/00-verbose ]
+ . /lib/lsb/init-functions.d/00-verbose
+ [ -r /lib/lsb/init-functions.d/40-systemd ]
+ . /lib/lsb/init-functions.d/40-systemd
+ _use_systemctl=0
+ [ -d /run/systemd/system ]
+ [ -n  ]
+ [ bootemail = init-d-script ]
+ [ bootemail = start ]
+ executable=bootemail
+ argument=start
+ prog=bootemail
+ service=bootemail.service
+ systemctl -p LoadState --value show bootemail.service
+ state=loaded
+ [ loaded = masked ]
+ [ 1529 -ne 1 ]
+ [ -z  ]
+ readlink -f bootemail
+ [ loaded != not-found ]
+ _use_systemctl=1
+ systemctl -p CanReload --value show bootemail.service
+ [ no = no ]
+ [ start = reload ]
+ [ 1 = 1 ]
+ set +e
+ set +u
+ systemctl_redirect bootemail start
+ local s
+ local rc
+ local prog=bootemail
+ local command=start
+ s=Starting bootemail (via systemctl)
+ service=bootemail.service
+ systemctl --quiet is-system-running
+ [ start = status ]
+ log_daemon_msg Starting bootemail (via systemctl) bootemail.service
+ [ -z Starting bootemail (via systemctl) ]
+ log_daemon_msg_pre Starting bootemail (via systemctl) bootemail.service
+ :
+ [ -z bootemail.service ]
+ echo -n Starting bootemail (via systemctl): bootemail.service
Starting bootemail (via systemctl): bootemail.service+ log_daemon_msg_post Starting bootemail (via systemctl) bootemail.service
+ :
+ systemctl --no-pager start bootemail.service
+ rc=0
+ [ start = status ]
+ log_end_msg 0
+ [ -z 0 ]
+ local retval
+ retval=0
+ log_end_msg_pre 0
+ :
+ log_use_fancy_output
+ TPUT=/usr/bin/tput
+ EXPR=/usr/bin/expr
+ [ -t 1 ]
+ [ xxterm != x ]
+ [ xxterm != xdumb ]
+ [ -x /usr/bin/tput ]
+ [ -x /usr/bin/expr ]
+ /usr/bin/tput hpa 60
+ /usr/bin/tput setaf 1
+ [ -z ]
+ FANCYTTY=1
+ true
+ /usr/bin/tput setaf 1
+ RED=
+ /usr/bin/tput setaf 3
+ YELLOW=
+ /usr/bin/tput op
+ NORMAL=
+ [ 0 -eq 0 ]
+ echo .
.
+ log_end_msg_post 0
+ :
+ return 0
+ return 0
+ exit 0

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

Nexus1 schrieb:

Was bedeutet der Parameter -x ?? Mit der Ausgabe kann ich noch nicht viel anfangen:

-x wird verwendet um evtl. Fehler und das Verhalten/Ausführen des shell-Scriptes anzuschauen. Lt. der manpage von z. B. sh:

-x xtrace        Write each command to standard error (preceded by a ‘+ ’) before it is executed.  Useful
                            for debugging.

EDIT:

Wie ist die Ausgabe von:

systemctl cat bootemail.service

?

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

rklm schrieb:

Dann setzt Du eine Unit auf, die Dein Skript ausführt.

Das mach ich natürlich nebenher schon aber da bin ich noch nicht weit. Muss erst rausfinden welche fragen ich stellen muss...

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

Nexus1 schrieb:

Das hier geht an der Konsole nicht, "permission denied" sogar mit sudo:

date +"%Y-%m-%d %H:%M:%S   --start" >> /var/log/bootemail.log

Kannst Du evtl. mit z. B. tee (und sudo), in diese Datei schreiben?

echo "Test" | tee -a /var/log/bootemail.log
cat /var/log/bootemail.log

?

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

lubux schrieb:

Wie ist die Ausgabe von:

systemctl cat bootemail.service
user@server:/etc/init.d$ systemctl cat bootemail.service
# /run/systemd/generator.late/bootemail.service
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/bootemail
Description=LSB: Send eMail on boot, send eMail on shutdown
Before=rescue.target
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/bootemail start
ExecStop=/etc/init.d/bootemail stop

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

Nexus1 schrieb:

lubux schrieb:

Wie ist die Ausgabe von:

systemctl cat bootemail.service
user@server:/etc/init.d$ systemctl cat bootemail.service
# /run/systemd/generator.late/bootemail.service
# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/bootemail
Description=LSB: Send eMail on boot, send eMail on shutdown
Before=rescue.target
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/bootemail start
ExecStop=/etc/init.d/bootemail stop

OK, teste mal so wie ich es oben geschrieben habe (mit Pfad und nicht nur mit Name):

sudo sh -x /Pfad/zum/bootemail start

(Pfad und zum ersetzen/anpassen).

EDIT:

Siehe auch die Ergänzung im Beitrag vom: 18. September 2022 10:58 Uhr

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

Aktueller Stand des Scripts:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh
### BEGIN INIT INFO
# Provides:          bootemail
# Required-Start:
# Required-Stop:
# Default-Start:     1 2 3 4 5
# Default-Stop:      0 6
# Short-Description: Send eMail on boot, send eMail on shutdown
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

case "$1" in
  start|status)
    echo -e "Subject: Message from Server\n\nServer is booting" | msmtp xxx@web.de
    date +"%Y-%m-%d %H:%M:%S   Start" >> /var/log/bootemail.log
    ;;
  stop)
    echo -e "Subject: Message from Server\n\nServer is shutting down" | msmtp xxx@web.de
    date +"%Y-%m-%d %H:%M:%S   Stop" >> /var/log/bootemail.log
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    date +"%Y-%m-%d %H:%M:%S   Wrong Service Parameter" >> /var/log/bootemail.log
    exit 3
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    date +"%Y-%m-%d %H:%M:%S   Wrong Script Parameter" >> /var/log/bootemail.log
    exit 3
    ;;
esac

Nexus1

(Themenstarter)

Anmeldungsdatum:
17. September 2022

Beiträge: 34

lubux schrieb:

Kannst Du evtl. mit z. B. tee (und sudo), in diese Datei schreiben?

echo "Test" | tee -a /var/log/bootemail.log
user@server:/etc/init.d$ echo "Test" | tee -a /var/log/bootemail.log
tee: /var/log/bootemail.log: Permission denied
Test

lubux schrieb:

cat /var/log/bootemail.log
user@server:/etc/init.d$ cat /var/log/bootemail.log
2022-09-18 10:26:26   Start
2022-09-18 10:26:28   Stop
2022-09-18 10:30:27   Start
2022-09-18 10:48:01   Wrong Script Parameter

lubux schrieb:

OK, teste mal so wie ich es oben geschrieben habe (mit Pfad und nicht nur mit Name):

sudo sh -x /Pfad/zum/bootemail start
user@server:/etc/init.d$ sudo sh -x /etc/init.d/bootemail start
+ PATH=/sbin:/usr/sbin:/bin:/usr/bin
+ . /lib/lsb/init-functions
+ run-parts --lsbsysinit --list /lib/lsb/init-functions.d
+ [ -r /lib/lsb/init-functions.d/00-verbose ]
+ . /lib/lsb/init-functions.d/00-verbose
+ [ -r /lib/lsb/init-functions.d/40-systemd ]
+ . /lib/lsb/init-functions.d/40-systemd
+ _use_systemctl=0
+ [ -d /run/systemd/system ]
+ [ -n  ]
+ [ bootemail = init-d-script ]
+ [ bootemail = start ]
+ executable=/etc/init.d/bootemail
+ argument=start
+ prog=bootemail
+ service=bootemail.service
+ systemctl -p LoadState --value show bootemail.service
+ state=loaded
+ [ loaded = masked ]
+ [ 1608 -ne 1 ]
+ [ -z  ]
+ readlink -f /etc/init.d/bootemail
+ [ loaded != not-found ]
+ _use_systemctl=1
+ systemctl -p CanReload --value show bootemail.service
+ [ no = no ]
+ [ start = reload ]
+ [ 1 = 1 ]
+ set +e
+ set +u
+ systemctl_redirect /etc/init.d/bootemail start
+ local s
+ local rc
+ local prog=bootemail
+ local command=start
+ s=Starting bootemail (via systemctl)
+ service=bootemail.service
+ systemctl --quiet is-system-running
+ [ start = status ]
+ log_daemon_msg Starting bootemail (via systemctl) bootemail.service
+ [ -z Starting bootemail (via systemctl) ]
+ log_daemon_msg_pre Starting bootemail (via systemctl) bootemail.service
+ :
+ [ -z bootemail.service ]
+ echo -n Starting bootemail (via systemctl): bootemail.service
Starting bootemail (via systemctl): bootemail.service+ log_daemon_msg_post Starting bootemail (via systemctl) bootemail.service
+ :
+ systemctl --no-pager start bootemail.service
+ rc=0
+ [ start = status ]
+ log_end_msg 0
+ [ -z 0 ]
+ local retval
+ retval=0
+ log_end_msg_pre 0
+ :
+ log_use_fancy_output
+ TPUT=/usr/bin/tput
+ EXPR=/usr/bin/expr
+ [ -t 1 ]
+ [ xxterm != x ]
+ [ xxterm != xdumb ]
+ [ -x /usr/bin/tput ]
+ [ -x /usr/bin/expr ]
+ /usr/bin/tput hpa 60
+ /usr/bin/tput setaf 1
+ [ -z ]
+ FANCYTTY=1
+ true
+ /usr/bin/tput setaf 1
+ RED=
+ /usr/bin/tput setaf 3
+ YELLOW=
+ /usr/bin/tput op
+ NORMAL=
+ [ 0 -eq 0 ]
+ echo .
.
+ log_end_msg_post 0
+ :
+ return 0
+ return 0
+ exit 0
Antworten |