|
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:
| #!/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
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
Ehemalige
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
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 | $ 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
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
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/
|