staging.inyokaproject.org

Anwendung vor dem Herunterfahren beenden

Status: Ungelöst | Ubuntu-Version: Kubuntu 24.04 (Noble Numbat)
Antworten |

michahe

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Hallo,

ich möchte die Anwendung Akregator vor dem Herunterfahren ($ shutdown / $ reboot) beenden; diesen Code habe ich bisher:

1
2
3
4
5
6
7
#!/bin/bash
# ShutdownAkregator.sh: Akregator vor dem Herunterfahren des Systems beenden
pidAkregator=$(pidof -x akregator)         # pid ermitteln; Quelle: https://linuxsimply.com/bash-scripting-tutorial/process-and-signal-handling/check-if-process-is-running/#3_Using_%E2%80%9Cpidof%E2%80%9D_Command
if ps -p $pidAkregator > /dev/null; then
     echo "Akregator läuft und wird jetzt beendet."
     kill -SIGTERM $pidAkregator           # Prozess beenden; Quelle: https://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/
fi

Ist es richtig, dieses Skript für systemd in /usr/lib/systemd/system-shutdown/ zu speichern?

Ich freue mich auf Verbesserungsvorschläge und Berichtigungen.

Danke, Michael

Bearbeitet von kB:

Forensyntax (Normale Schrift statt Fettdruck) korrigiert. Bitte verwende Fettdruck nur für die in der Anleitung genannten Zwecke.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Mir fehlt gerade die Zeit, aber ich bin ziemlich sicher, dass Systemd die PID des Dienstes ein einer Variablen übergibt. Ich kann später mal schauen, wie ich das für den btrfs scrub aufgesetzt habe - der wird nämlich auch beim Herunterfahren ordentlich terminiert.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Danke rklm, ... Ich kann später mal schauen ...

dann warte ich ein wenig, kein Problem!

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Danke dingsbums,

Schaust du https://lists.debian.org/debian-user/2016/10/msg00422.html

aber was soll mir die Seite sagen? Mein eingangs gezeigter Code liefert in die Variable pidAkregator einen Wert, wenn Akregator läuft. Beende ich Akregator, ist pidAkregator leer.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Vielleicht noch mal als Anmerkung Akregator ist eine grafische Anwendung und kein Dienst der mit systemd gestartet wird.

Warum soll das eigentlich beendet werden? Beim herunterfahren wird doch die Desktopumgebung beendet und die beendet alle Anwendungen!?

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3793

Daß es um eine Desktopanwendung geht, hatte ich überlesen. Da ist das eigentlich weniger sinnvoll, da gebe ich Marc_BlackJack_Rintsch recht.

Mein Link bezog sich eigentlich mehr auf rklm's Beitrag in Richtung systemd.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Danke, Marc_BlackJack_Rintsch

Vielleicht noch mal als Anmerkung Akregator ist eine grafische Anwendung und kein Dienst der mit systemd gestartet wird. Warum soll das eigentlich beendet werden? Beim herunterfahren wird doch die Desktopumgebung beendet und die beendet alle Anwendungen!?

Die Anwendung soll beendet werden, um folgenden Effekt zu vermeiden:

  • Im Standard gibt es bei neuen Meldung im Systemabschnitt der Kontroll-Leiste ein Symbol, dieses kann ich anklicken und Akregator öffnet. Ein Klick auf das X in der Fensterleiste schließt das Fenster, AKregator bleibt aktiv um neue Nachrichten zu holen.

  • Gebe ich in der Konsole z.B. $ reboot, startet das System wie gewünscht neu. Akregator wird per Systemeinstellung > AutoStart gestartet.

  • Auch jetzt gibt es bei neuen Meldung im Systemabschnitt der Kontroll-Leiste ein Symbol, dieses öffnet aber Akregator nicht. Laut den KDE-Experten liegt es daran, dass die Anwendung nicht ordnungsgemäß beendet wurde.

  • Um das Standard-Verhalten wiederherzustellen muss folgende Prozedur ausgeführt werden: Rechtsklick auf das Symbol > Rechtsklick > Configure > Symbol im Systembereich anzeigen > NEIN > übernehmen > Symbol im Systembereich anzeigen > JA OK. Oder ich muss immer daran denken, vor $ Reboot das Akregator-Fenster zu aktivieren und die Anwendung mit Datei > Beenden zu schließen. Das möchte ich gerne umgehen ...

Wie kann ich (ohne systemd) die Anwendung beenden?

Übrigens: Mein Befehl

kill -SIGTERM $pidAkregator

funktioniert und die Funktion des Symbols bleibt erhalten.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

dingsbums schrieb:

Mein Link bezog sich eigentlich mehr auf rklm's Beitrag in Richtung systemd.

Die PID ist in der Variablen MAINPID. Die kann man benutzen um ein Signal an den Service zu schicken oder zu überprüfen, ob der Service noch läuft. In meinem Skript sieht der relevante code so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
case "$1" in
...
stop|cancel)
  test -z "$MAINPID" && exit
  btrfs scrub cancel "$2"

  while kill -0 $MAINPID 2>/dev/null; do
    sleep 0.2
  done
  ;;
...
esac

Und der Service

1
2
3
4
5
6
7
8
$ cat /etc/systemd/system/btrfs-scrub@.service 
[Unit]
Description=Scrub a btrfs filesystem

[Service]
Type=simple
ExecStart=/root/btrfs-scrub-service start "%f"
ExecStop=/root/btrfs-scrub-service cancel "%f"

Lass Dich von dem "@" und "%f" nicht irritieren; das ist ein Mechanismus, durch den man einen Template-Service haben kann, der für mehrere Pfade als separater Service laufen kann. Aber das ist irrelevant für Dein Problem mit dem Terminieren. Und, in Deinem Fall muss es ein "user" Service sein - nicht "system".

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Danke rklm,

aber Dein Code übersteigt mein Wissen:

$ systemctl status akregator-service
Unit akregator-service.service could not be found.

Ich denke an das Folgende, Fragen gekennzeichnet mit ###

#!/bin/bash
# ShutdownAkregator.sh: Akregator vor dem Herunterfahren des Systems beenden
pidAkregator=$(pidof -x akregator)         # pid ermitteln; Quelle: https://linuxsimply.com/bash-scripting-tutorial/process-and-signal-handling/check-if-process-is-running/#3_Using_%E2%80%9Cpidof%E2%80%9D_Command
case "$1" in     ### Was ist "S1"?
stop|cancel)
  test -z "$pidAkregator" && exit
  btrfs scrub cancel "$2"   ### Wo steht "btrfs scrub cancel" und was ist "$2"?

  while kill -0 $pidAkregator 2>/dev/null; do
    sleep 0.2
  done
  ;;
esac
]]]

Und der Service:
{{{#!code console
$ cat /etc/systemd/system/Akregator@.service 
[Unit]
Description=Akregator starten / beenden

[Service]
Type=simple
ExecStart=/username/btrfs-scrub-service start "%f"   ### Wo ist btrfs-scrub-service bzw. akregator-service?
ExecStop=/username/btrfs-scrub-service cancel "%f"

Ich bin Dir sehr dankbar für eine Anleitung!

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 5232

So weit mir bekannt ist, haben Systemd Service Units die Endung:

.service

... nicht die Endung:

-service

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

michahe schrieb:

aber Dein Code übersteigt ...

BTW: Hier ein Beispiel für eine (aktive) service-unit, die unmittelbar _vor_ dem reboot/shutdown ein Script ausführt:

Unit]
Description=Execute a script before reboot/shutdown
Before=shutdown.target
Requires=network-online.target
Requires=sys-subsystem-net-devices-eth0.device

[Service]
User=<user>
WorkingDirectory=/usr/local/bin
ExecStart=/usr/bin/true
ExecStop=/usr/local/bin/sendgmx
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
:~ $ systemctl status sendgmx
● sendgmx.service - Run sendgmx at reboot and at shutdown
     Loaded: loaded (/etc/systemd/system/sendgmx.service; enabled; preset: enabled)
     Active: active (exited) since Wed 2025-09-03 12:49:31 CEST; 4min 28s ago
    Process: 525 ExecStart=/usr/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 525 (code=exited, status=0/SUCCESS)
        CPU: 4ms

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

trollsportverein schrieb:

So weit mir bekannt ist, haben Systemd Service Units die Endung:

.service

Leider nicht:

$ systemctl status akregator.service
Unit akregator.service could not be found.

$ systemctl | grep akregator
$ 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

lubux schrieb:

BTW: Hier ein Beispiel für eine (aktive) service-unit, die unmittelbar _vor_ dem reboot/shutdown ein Script ausführt:

Aber das scheint eine "system" Unit zu sein - nur halt eine, die mit einem anderen Nutzer als root läuft. Hängt halt davon ab, ob man beim System-Shutdown etwas machen will / muss oder wenn die User-Session stirbt. Das hängt von der Natur des Dienstes ab.

michahe

(Themenstarter)

Anmeldungsdatum:
12. Dezember 2013

Beiträge: 874

Über eine konkrete Anleitung zur Lösung meiner Aufgabe würde ich mich freuen.

Der einzige Hinweis auf systemd war von mir in der Eingangs-Frage, basierend auf dieser Seite (#5).

Hier gibt es einen Hinweis auf $HOME/.config/plasma-workspace/shutdown/

Antworten |