Systemd service starten nachdem service fertig ist.

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 09.07.2017 10:15:01

Hi

Ich will ein script starten. Bevor soll aber ein service beendet werden, das geht mit Conflicts=
Aber wie starte ich ein service nachdem das script fertig ist?

Was ich bis jetzt habe:

Code: Alles auswählen

[Unit]
Description=Stops deluge, starts sync, starts deluge again.
Conflicts=deluged.service

[Service]
Type=oneshot
User=carlos
Group=carlos
ExecStart=/home/carlos/snap_sync.sh
ExecStopPost=deluged.service
ExecStopPost= geht nicht.
[/etc/systemd/system/snapraid.service:10] Executable path is not absolute, ignoring: deluged.service

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

DeletedUserReAsG

Re: Systemd service starten nachdem service fertig ist.

Beitrag von DeletedUserReAsG » 09.07.2017 10:21:21

… und wenn du einen absoluten Pfad angibst, wie’s die Meldung nahelegt?

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 09.07.2017 10:41:01

Lord_Carlos hat geschrieben:

Code: Alles auswählen

 ExecStopPost=deluged.service
Warum überhaupt? Wegen "conflicts" passiert das doch automatisch.

Und ohne"conflicts" würde ich es so versuchen:

Code: Alles auswählen

 ExecStopPost=/bin/systemctl stop deluged.service
Und wenn das script fertig ist, starte die neue/andere unit doch einfach als letzte aktion im script:

Code: Alles auswählen

 /bin/systemctl start irgendwas.service
Zuletzt geändert von TomL am 09.07.2017 11:05:22, insgesamt 1-mal geändert.

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 09.07.2017 10:47:28

ExecStopPost= ist schon richtig, ich will es ja starten wenn das script fertig ist.
Siehe: https://www.freedesktop.org/software/sy ... cStopPost=

ExecStopPost=/bin/systemctl start deluged.service
Habe ich auch versucht, aber das schlaegt fehl. (code=exited, status=1/FAILURE)
Ich nehme an weil es keine Rechte hat. Ich muesste also ExecStart= als user carlos starten, und ExecStopPost= also root.

Edit:
ExecStart=/bin/su -c "/home/carlos/snap_sync.sh" -s /bin/sh carlos
ExecStopPost=/bin/systemctl start deluged.service


So wird deluge wieder gestartet. Aber ich glaube das script wird jetzt im hintergrund ausgefuehrt, also wird deluge gestartet noch bevor es fertig ist.

Code: Alles auswählen

Jul 09 10:51:46 cube systemd[1]: Starting Stops deluge, starts sync, starts deluge again....
Jul 09 10:51:46 cube su[6414]: Successful su for carlos by root
Jul 09 10:51:46 cube su[6414]: + ??? root:carlos
Jul 09 10:51:46 cube su[6414]: pam_unix(su:session): session opened for user carlos by (uid=0)

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 09.07.2017 11:06:16

Deswegen sagte ich ja, die neue Unit IM script starten, vor dem exit 0
Und wenn das script fertig ist, starte die neue/andere unit doch einfach als letzte aktion im script:

Code: Alles auswählen

 /bin/systemctl start deluge.service

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 09.07.2017 11:12:17

Aber das script soll als benutzter "carlos" laufen, der keine rechte dazu hat.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 09.07.2017 11:35:03

Oh shit.... ich lese wieder mal nicht richtig.... war aber vorhin auch nur am Handy..... sorry....

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 09.07.2017 11:41:20

Also, wenn das Script von einer Unit gestartet wird, und KEIN Langläufer ist, uns sich relativ schnell beendet, und zwar innerhalb der Systemd-Timeout-Zeit, dann würde ich deluge.service mit "requires" und "after" zur Script-Unit starten. Damit wird vor dem Start deluge.service auf jeden Fall die Script-Unit abgearbeitet. Der Start von deluge.service veranlasst quasi vorher den Start der Script-Unit.Die Script-Unit muss dazu noch nicht mal eingeplant werden, deluge.service holt sich die immer wieder, wenn sie gestartet wird.

Also, wenn deluge.service gestoppt wird, mit dem Hintergedanken, dass Script zu starten, brauchst Du nur deluge.service neu zu starten, das script kommt dann automatisch VORHER. Allerdings läuft der Prozess Execstart in der deluge.service NUR, wenn die Script-Unit mit exit 0 zurückkehrt.

Is gar nich kompliziert... oder ...? *lol

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 09.07.2017 12:42:38

Eine Unit für das Script.

Code: Alles auswählen

 
[Service] 
Type=oneshot

Das bewirkt, dass die Unit erst nach dem Abschluss des Scripts ein fertif an systemd rückmeldet.

Und in den Unit-Block des Skripts

Code: Alles auswählen

 
[Unit] 
Wants=deluged.service
Before=deluged.service
Das bewirkt, dass deluged.service gestartet wird, nachdem dieUnit für das Skript erfolgreich gestartet wurde. Und die Rückmeldung kommt durch oneshot eben erst nach dem erfolgreichen beenden des Skriptes.

Lg scientific


dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 09.07.2017 14:56:03

@TomL
Das script braucht mehrere minuten, ggf auch Stunden.
___________
@scientific
Danke, aber so ganz klappt es bei mir nicht.
So sieht es jetzt aus:

Code: Alles auswählen

[Unit]
Description=Stops deluge, starts sync, starts deluge again.
Conflicts=deluged.service
Wants=deluged.service
Before=deluged.service

[Service]
Type=oneshot
User=carlos
Group=carlos
ExecStart=/home/carlos/snap_sync.sh
Deluge wird nicht gestartet.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 09.07.2017 15:10:05

Das Conflicts= passt da auch nicht rein. Das würd ich über ein Drop-In bei deluged.service reinkippen.
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 09.07.2017 15:20:30

Was sollte denn in der deluge drop-in conf stehen?

Vielleicht habe ich das ganze auch falsch erklerart.

Momentan startet deluge beim starten und laeuft dann. So soll es auch weiterhin funktionieren.
Jetzt soll aber jeden tag um 3 Uhr deluge beendet werden und die parity platte ueberprueft werden. Danach soll deluge wieder gestartet werden.
Es geht dadrum das sie keine Daten aendern waerend ein snapraid sync laeuft.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 09.07.2017 16:09:52

In

Code: Alles auswählen

/etc/systemd/system/deluged.service.d/unit.conf
Ist

Code: Alles auswählen

[Unit]
Conflicts=deinskript.service
Und in der service-Unit deines Skripts muss die Conflicts-Zeile raus.

Hab schon verstanden, was bei dir gefordert ist.

Muss es aber nochmal probieren, falls es nicht klappt bei dir. Habs unlängst auf deinen ersten Hinweis erfolgfreich getestet.

Lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 09.07.2017 17:09:23

Das geht garnicht. Deluge wird nicht gestopped und wenn man es vorher manuell stopped, wird es auch nicht gestartet.

Ich koennte deluge in ein docker container packen, die kann mein script starten und stoppen :/

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 09.07.2017 17:34:14

Dann muss ich das daheim am Abend nochmal testenl.
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 09.07.2017 22:35:58

Lord_Carlos hat geschrieben: ↑ zum Beitrag ↑
09.07.2017 15:20:30
Momentan startet deluge beim starten und laeuft dann. So soll es auch weiterhin funktionieren.
Jetzt soll aber jeden tag um 3 Uhr deluge beendet werden und die parity platte ueberprueft werden. Danach soll deluge wieder gestartet werden. Es geht dadrum das sie keine Daten aendern waerend ein snapraid sync laeuft.
Ok, jetzt habe ich das verstanden. Und ich finde das nicht so kompliziert. Ich würde einen Parent-Prozess (als root) laufen lassen, der die beiden Child-Prozesse dann startet, wenns notwendig ist. Deluge wird dabei mit UID "carlos" gestartet, der andere Prozess wie auch immer. Der Parent-Process beendet täglich um 3:00 Uhr deluge.service und startet den prüf.service. Und wenn der Prüfprozess fertig ist, informiert er -vor dem exit- den Parent-Prozess, das er fertig ist .... und der Parent wiederum startet erneut den deluge.servise. Der Parent-Prozess wartet (wenn der Prüf-Job läuft) einfach solange, bis er benachrichtigt wird. Wenn allerdings der Prüfjob stirbt, stirbt auch die Job-Kette. Das muss berücksichtigt werden.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 10.07.2017 03:17:09

Also... ich hab jetzt ein Testszenario aufgebaut.

Dieses Service stoppt über Conflicts=%i das Service %i (also z.B. my-service.service), führt einen Dump aus (ExecStart=...) und startet über eine Abhängigkeit nach dem Ende von ExecStart=.... einen Timer, der den ursprünglichen Service wieder startet.

Code: Alles auswählen

# cat my-dump@.service
[Unit]
Wants=my-restart@%i.timer
Before=my-restart@%i.timer
Conflicts=%i
After=%i

[Service]
Type=oneshot
ExecStart=/usr/local/bin/my-dump.sh
Der Timer, der im my-dump@%i.service gestartet wird, Dieser Timer startet lediglich ein Target, das als Abhängigkeit wieder den Server hat.

Code: Alles auswählen

# cat my-restart@.timer
[Unit]

[Timer]
OnActiveSec=1s
Unit=my-restart@%i.target
RemainAfterElapse=no
Das Target, das vom Timer gestartet wird. Es beendet sich sofort wieder nach dem Start des Services

Code: Alles auswählen

# cat my-restart@.target
[Unit]
Wants=%i
Before=%i
StopWhenUnneeded=true
Schließlich noch die Unit für den Testserver

Code: Alles auswählen

# cat my-server.service
[Unit]
Description=MEIN_TEST_SERVER

[Service]
ExecStart=/usr/local/bin/my-test.sh
Und noch der Inhalt des Testservers:

Code: Alles auswählen

# cat /usr/local/bin/my-test.sh 
#!/bin/bash

while :
do
    echo "SERVER_IS_RUNNING"
    sleep 1
done
exit 0
Und der Inhalt des Dump-Skriptes:

Code: Alles auswählen

# cat /usr/local/bin/my-dump.sh 
#!/bin/bash

echo "DB_DUMP_START"
sleep 5 
echo "DB_DUMP_STOP"
exit 0
Du kannst den Server gleich so starten, dass am Begin der Dump gemacht wird und dann der Server gestartet wird:

Code: Alles auswählen

systemctl start my-dump@my-server.service.target
Mit dem selben Befehl stößt du aber auch an, dass der Server gestoppt wird, dann wird der Dump gemacht, und der Server wird wieder gestartet.

Wenn der Server einfach mit dem multi-user.target gestartet werden soll, dann kommt natürlich in my-server.service noch

Code: Alles auswählen

[Install]
WantedBy=multi-user.target
hinzu.

Wie wirst du denn um 3 in der Früh den Sync starten? Mit cron, mit systemd-cron oder mit einer systemd-timer-unit?

Dementsprechend musst du halt dann my-dump@.target noch um eine Install-Section erweitern oder den oben genannten Aufruf in ein Skript oder Timer-Unit einbauen.

Soweit einmal von mir mein Vorschlag. Ist ein wenig kompliziert. Systemd scheint für solche Anwendungsfälle nicht unbedingt gebaut zu sein. Versucht man es nur mit Before= After= Conflicts= zu lösen, erzeugt man damit bloß Abhängigkeitsschleifen, die systemd nicht auflösen kann. Daher auch die Entkoppelung über Timer und Targets.

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 10.07.2017 03:32:21

Auf deine Verhältnisse umgebaut müssten die Units dann so aussehen:

du musst natürlich zuerst nach /etc/systemd/system wechseln

Code: Alles auswählen

cd /etc/systemd/system

Code: Alles auswählen

# cat snap_sync.service
[Unit]
Wants=deluged-restart.timer
Before=deluged-restart.timer
Conflicts=deluged.service
After=deluged.service

[Service]
Type=oneshot
User=carlos
Group=carlos
ExecStart=/home/carlos/snap_sync.sh

# Auskommentieren der folgenden zwei Zeilen startet deluged.service schon beim Booten mit einem snap_sync voran
#[Install]
#WantedBy=multi-user.target

Code: Alles auswählen

# cat deluged-restart.timer
[Unit]

[Timer]
OnActiveSec=1s
Unit=deluged-restart.target
RemainAfterElapse=no

Code: Alles auswählen

# cat deluged-restart.target
[Unit]
Wants=deluged.service
Before=deluged.service
StopWhenUnneeded=true

Du startest deluged.service beim Booten? Dann ist darin wohl

Code: Alles auswählen

[Instal]
WantedBy=multi-user.target
enthalten. Wenn du die zwei Zeilen in der snap_sync.service aktiviest, dann benötigst du noch

Code: Alles auswählen

systemctl disable deluged.service
systemctl enable snap_sync.service
Damit snap_sync immer um 3 Uhr morgens gestartet wird, brauchst du noch diesen Timer:

Code: Alles auswählen

#cat snap_sync.timer
[Unit]
Description=Timer for snap_sync for deluged

[Timer]
OnCalendar=*-*-* 03:00
Persistent=true
Unit=snap_sync.service

[Install]
WantedBy=timers.target

Achtung!!!
Wenn deluged.service nicht läuft, wird er mit snap_sync.service gestartet!!!
Wenn du das nicht möchtest, benötigst du noch zusätzlich die Zeile

Code: Alles auswählen

ExecStartPre=/bin/sh -c "/bin/systemctl is-active deluged.service"
in snap_sync.service in der [Service]-Section

Dann wird aber der Sync auch nur ausgeführt, wenn deluged.service läuft. Läuft der um 3 Uhr morgens nicht, wird auch nix gesynct!

lg scientific

PS: Man möge mir eventuelle Fehler verzeihen, es ist schon spät...
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 10.07.2017 11:32:39

Moin

Ich glaube, dass es auch etwas einfacher geht... mit nem einfachen Script, welches als Parent-Prozess sowohl deluge.service startet bzw. beendet als auch snapraid.service. Der Parent-Prozesss läuft natürlich als root, aber deluge oder snap-sync können unter irgendeiner UID laufen.

Als Rahmen würde ich dieses kleine Script nutzen, was als Parent-Prozess mit root-Rechten läuft. Es beendet um 3:00 Uhr deluge.service und startet snapraid.service. Wenn der snap-sync fertig ist, startet es wieder deluge.service und wartet erneut wieder bis 3:00 Uhr.

Code: Alles auswählen

#!/bin/bash

cycletime=86400
trap SIGTERM

while true; do
    echo "systemctl start deluge.service"
        now=$(date +"%s")
        starttime=$(date +"%s" -d "03:00")
        [ $starttime -gt $now ] && seconds2wait=$(($starttime-$now)) || seconds2wait=$(($starttime+$cycletime-$now))
        [ $seconds2wait -lt 0 ] && exit 1
        echo "warte: $seconds2wait"
    
        sleep $seconds2wait &
        /bin/echo "$!" >"pidfile"
        wait 2> /dev/null

        [ -f "pidfile" ] && /bin/rm pidfile || exit 0
    echo "systemctl stop deluge.service"
    
    echo "systemctl start snapraid.service"
    sleep 23h &
    /bin/echo "$!" >"pidfile"
    wait 2> /dev/null
    [ -f "pidfile" ] && /bin/rm pidfile || exit 0
done;
Die Besonderheit ist, dass das snap-sync-Script den Parent-Prozess informieren muss, dass es fertig ist und das deluge.service erneut gestartet werden kann. Diese Info erfolgt durch das snap-sync-script mit dem folgenden letzten Befehl, bevor es sich mit exit beendet:

Code: Alles auswählen

/bin/kill -SIGTERM $(/bin/cat pidfile)
Damit beginnt dann ein neuer Zyklus mit dem Start von deluge.service und warten auf den nächsten 3-Uhr-Termin

Der Parent-Prozess selber kann auch ganz einfach beendet werden. Entweder über Script oder einfach via Terminal

Code: Alles auswählen

thomas@thomaspc:~
$ cat pidfile; rm pidfile
5704
thomas@thomaspc:~
$ /bin/kill -SIGTERM 5704
SIGTERM beendet in keinem der Beispiele den Parentprozess oder deluge.service oder snapraid.service, sondern immer NUR den wartenden Sleep. Ob der Prozess weiter läuft, entscheidet hier, ob vor dem SIGTERM das Pidfile gelöscht wurde. Sinnigerweise sollte man das Pidfile natürlich mit ordentlichem Pfad versehen. Aber zum spielen hat das natürlich auch so gereicht.

Man kann recht einfach mit dem Job rumspielen... in einem Terminalfenster starten und in einem zweiten immer mit ein paar Sekunden Abstand

Code: Alles auswählen

/bin/kill -SIGTERM $(/bin/cat pidfile)
abschicken. Durch die Ausgaben sieht man den Wechsel. Ganz zum Schluss erst die PID holen, pidfile löschen und SIGTERM mit der PID absenden... damit wird der Prozess beendet.

h.t.h.

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 10.07.2017 13:44:24

Ich hatte gerade unterwegs mit Hund richtig Bock drauf, dass mal Rund zu machen... und das ist draus geworden. Ich habe das Script nun settimerevent genannt.

Code: Alles auswählen

#!/bin/bash

starttime="03:00"
cycletime=86400                     # 24 Stunden

#============================================================================================

SetupHandlerTimerevent()
{
    trap SIGTERM

    while true; do
        echo "systemctl start deluge.service"
            now=$(date +"%s")
            getstarttimesec=$(date +"%s" -d "$starttime")
            [ $getstarttimesec -gt $now ] && seconds2wait=$(($getstarttimesec-$now)) || seconds2wait=$(($getstarttimesec+$cycletime-$now))
            [ $seconds2wait -lt 0 ] && exit 1
            echo "warte: $seconds2wait"

            sleep $seconds2wait &
            /bin/echo "$!" >"pidfile"
            wait 2> /dev/null

            [ -f "pidfile" ] && /bin/rm pidfile || exit 0
        echo "systemctl stop deluge.service"

        echo "systemctl start snapraid.service"
        sleep 23h &
        /bin/echo "$!" >"pidfile"
        wait 2> /dev/null
        [ -f "pidfile" ] && /bin/rm pidfile || exit 0
    done;
}
#============================================================================================
# Setup daemon

action=$1

case $action in
    start)
        SetupHandlerTimerevent &
        ;;
    stop)
        if [ -f pidfile ];then
            pid=$(/bin/cat pidfile)
            /bin/rm pidfile
            /bin/kill -SIGTERM $pid
        fi
        ;;

    *)
        echo -e "\nAufruf: $(basename $0) start | stop\n"
        echo "Beendet! Falsche oder fehlende Parameter"
        ;;
esac

exit 0
#============================================================================================
# End
Es wird mit Parameter gestartet und auch wieder gestoppt:

Code: Alles auswählen

settimerevent start
oder
settimerevent stop
Achtung: Die Ausgaben beim Spielen und Testen können irritierend sein, es sieht aus, als hängt es. Nee, tuts nicht, der Prozess läuft sauber im Hintergrund, einfach Enter drücken und der Prompt erscheint wieder. Wenn die "echo's" entfernt sind, was ja im richtigen Lauf unbedingt sein muss, ist dieser Effekt weg.

Und wieder kann man in einem zweiten Fenster spielen und mit Abstand einiger Sekunden

Code: Alles auswählen

/bin/kill -SIGTERM $(/bin/cat pidfile)
abschicken und man sieht sofort im ersten Fenster den Effekt.

Achtung No2, in der endgültigen Version den vollständigen bzw. absolute Pfade fürs Pidfile nicht vergessen.

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 10.07.2017 13:56:01

Ob das jetzt so viel einfacher ist...
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

TomL

Re: Systemd service starten nachdem service fertig ist.

Beitrag von TomL » 10.07.2017 14:13:02

scientific hat geschrieben: ↑ zum Beitrag ↑
10.07.2017 13:56:01
Ob das jetzt so viel einfacher ist...
Ich dachte ja.... ich habe vorher nur 2 Seiten voll mit Service-Units gesehen, deren Zusammenspiel und die Zusammenhänge für mich kaum zu verstehen war. Ich dachte, ein einfaches kleines Script und nur die Unit um es zu starten... mehr brauchts nämlich nicht... ist einfacher....

Aber ist doch auch völlig egal.... wenns funktioniert ist's richtig.... Carlos wird sein Problem schon irgendwie lösen... auf welchen Weg auch immer...

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 10.07.2017 14:27:17

Ich werde heute Abend nochmal scientific weg versuchen, wenn das nicht klappt werde ich es via container loesen.
Das schoene an systemd service ist ja das man die Uhrzeit etc. relativ einfach mit systemd timers einstellen kann ohne ein script zu veraendern.

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Systemd service starten nachdem service fertig ist.

Beitrag von scientific » 10.07.2017 16:30:11

TomL hat geschrieben: ↑ zum Beitrag ↑
10.07.2017 14:13:02
scientific hat geschrieben: ↑ zum Beitrag ↑
10.07.2017 13:56:01
Ob das jetzt so viel einfacher ist...
Ich dachte ja.... ich habe vorher nur 2 Seiten voll mit Service-Units gesehen, deren Zusammenspiel und die Zusammenhänge für mich kaum zu verstehen war. Ich dachte, ein einfaches kleines Script und nur die Unit um es zu starten... mehr brauchts nämlich nicht... ist einfacher....

Aber ist doch auch völlig egal.... wenns funktioniert ist's richtig.... Carlos wird sein Problem schon irgendwie lösen... auf welchen Weg auch immer...
Es sind 3 einfache kleine Units mit insgesamt 24 Zeilen. Dein Skript zählt 42 (ohne Kommentar- und Leerzeilen)... ;-)
Ein Service, der das Sync macht und über Conflicts= den Server zuvor beendet.
Ein Timer, der nach dem Sync gestartet wird und 1 Sekunde zählt und dann ein Target aktiviert, welches als Abhängigkeit wieder den ursprünglichen Server hat.

Die Timer-Target-Konstruktion benötigt man, weil sonst eine Abhängigkeits-Loop entsteht, die systemd nicht auflösen kann.

Ich studiere schon die längste Zeit, wie man der Konstruktion noch auf simplem Weg beibringen, dass deluged.service nur dann gestartet werden soll, wenn es zuvor schon gelaufen ist... Es will mir nur nicht einfallen... :)
Denn ich vermute, es ist keine gute Idee, wenn der Server um 3 in der Früh nicht läuft, dass deluged.service dann gestartet wird. Oder ist das ok so?
Hab schon mehrere Varianten getestet... Ich komm da auf keinen grünen Zweig.

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: Systemd service starten nachdem service fertig ist.

Beitrag von Lord_Carlos » 10.07.2017 16:34:36

Ich sehe kein Grund deluge jemals auszumachen, aber den server laufen zu lassen. Normal sollte beides immer an sein :) Von daher kein Problem.

Kann man ein service starten, wenn ein Monitor angeschaltet wird? Dann muesste Kodi nicht immer laufen :D

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Antworten