Portál AbcLinuxu, 8. května 2025 04:19

Dotaz: Systemd suspend - jak přerušit proces?

7.2.2017 21:27 JanM | skóre: 28
Systemd suspend - jak přerušit proces?
Přečteno: 543×
Odpovědět | Admin

Zdravím, trochu předělávám HTPC na Lubuntu 16.04 + KODI + TVHeadEnd a marně hledám řešení na následující problém.

Rád bych, aby KODI v idle stavu (je k tomu nějaký add-on, který sleduje stav TVHeadEndu) uspal počítač. Bohužel mu nejde nadefinovat, jakým příkazem jej má uspat, asi používá dbus + polkit + kdovíco v rámci standardního Ubuntu.

V každém případě to vypadá, že suspend to RAM z KODI vede ke spuštění "systemctl suspend", který skončí zatuhnutím počítače (blikající kurzor konzole na černé obrazovce).

Dobrá zpráva je, že staré dobré "pm-suspend" stále funguje, takže by mohlo stačit vzít mé /etc/pm/sleep.d/ skripty a navěsit na systemd. Po pročtení https://wiki.archlinux.org/index.php/Power_management#Sleep_hooks jsem pár z možností vyzkoušel, jenže ouha:

service se při systemctl suspend spustí, systemd však na nic nečeká a pokračuje v uspávání bez ohledu na _výsledek_ mého skriptu.

[Unit]
Description=Local system suspend actions
Before=sleep.target

[Service]
Type=simple
ExecStart=/etc/pm/sleep.d/01_kodi suspend

[Install]
WantedBy=sleep.target

Jak to tak chápu, tak volba "Before=" se postará pouze o _spuštění_ mého skriptu. Pokud včas selže (exit 1 hned na začátku skriptu), tak se to objeví v logu, ale suspend běží dál.

V praxi však ani nestačí případně selhat (ukončuje nějaké služby a odstraňuje USB moduly), počítač se dříve dostane v procesu uspávání do bodu zamrznutí... Čili "hook" poměrně k ničemu.

Poradíte někdo, jak donutit systemd, aby nejprve spustil můj skript a poté případně pokračoval v uspávání počítače?


Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.2.2017 21:32 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jen dodám, že dříve jsem to řešil samostatným skriptem spouštěným v pětiminutovém intervalu, který sledoval stav MythTV backendu, KODI, připojených uživatelů, SMB sdílení, atd. a byl-li šťasten, tak uspal počítač.

Byl v tom trochu zmatek, raději bych to řešil "jednoduše" z KODI...
k3dAR avatar 7.2.2017 23:10 k3dAR | skóre: 63
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
kdyz uz mas na HTPC vyklestene Lubuntu, co vyklestit i systemd? *buntu 16.04 ma pri startu v grub advanced volbu i jako upstart ve vychozi instalaci, dela to jen pouzitim kernel parametru: init=/sbin/upstart
porad nemam telo, ale uz mam hlavu... nobody
8.2.2017 07:23 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
Zajímavá informace, ale tomu bych se raději vyhnul. Systemd používám tak jako tak (Arch Linux) a do budoucna je upstart neperspektivní...
k3dAR avatar 8.2.2017 13:34 k3dAR | skóre: 63
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
btw: s 16.04 to mas perspektivni do roku 2021 ;)
porad nemam telo, ale uz mam hlavu... nobody
8.2.2017 07:26 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak hlavní otázka vyřešena, nutno použít /lib/systemd/system-sleep drop-in folder: pak proces uspávání počká na úplné vykonání skriptu.

Nicméně objevila se nová otázka: jak proces uspávání přerušit, pokud skript skončí chybovým kódem (zatím je to ignorováno a počítač zatuhne...).
8.2.2017 13:50 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Síce si neviem predstaviť dôvod na uspávanie HTPC, ale to nevadí. Predpokladám že ten HTPC ovládaš diaľkovým alebo klávesnicou. Nemôžeš si namapovať ten pm-suspend (alebo echo disk > /sys/power/state) na klávesu vypínania?
8.2.2017 19:50 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
To neodpovídá mému využití - počítač slouží i jako NAS (wake-on-demand) a DVR (wake-on-alarm), takže se poté musí sám i vypnout. Nehledě na to, že naprostá většina spotřebičů se vypíná po čase sama, tak proč by to nemělo umět HTPC.

V minulosti jsem to řešil přes MythTV, ve kterém lze všechny skripty nadefinovat. Ale byl pěkný opruz to vyladit a pospojovat komponenty (MythTV BE a Kodi FE + ostatní).

Kodi má nastavení suspendu při idle (vč. vazby na TVHeadEnd) v sobě, stačí mi dodělat jeden skript na hlídání ostatních věcí (SSH, SMB) a nějak ho naroubovat na mechanismus vypínání KODI.

P.S. Původně jsem měl v plánu tu extra kontrolu před vypnutím provádět až při "systemctl suspend", ale to už evidentně není cesty zpět (ten příkaz nedělá nic jiného, než echo blabla > /sys/disk/state a /sys/power/state, jen před tím spustí pár hooks).
Řešení 1× (JanM (tazatel))
10.2.2017 06:30 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?

Tak jen pro úplnost doplním:

 

  • jak zastavit proces uspávání po 'systemctl suspend' jsem nezjistil;
  • moji situaci nakonec vyřešily doplňky Kodi: service.sleepy.watchdog a service.tvh.manager. Ten první umí po definované době nečinnosti spustit jiný doplněk Kodi a ten druhý udělá zbytek práce (zkontroluje TVHeadEnd, zda nenahrává; otevřené porty, zda není někdo vzdáleně připojen; uloží RTC alarm a spustí standardní uspání počítače).
    Podobně by to šlo řešit i přes Kodi Callbacks, tam lze vnutit i externí skripty, pokud by funkce tvh.manageru nestačily.
Nicméně, to že v případě selhání hooks pro 'systemctl suspend' nedojde k přerušení uspávání, není nic moc, neb v mém případě počítač zatuhne a už s ním hne jen fyzické násílí (hard-reset).

 

14.2.2017 18:12 j
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
Bez polozit kytku na nahrobek potteringovi ... shit, on ho jeste nikdo nezabil?
13.2.2017 08:08 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Systemd suspend - jak přerušit proces?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro úplnost jen doplním, že důvod, proč systemd nepočkal na ukončení uvedeného skriptu byl ten, že "Type=simple" (ExecStart se jen "spustí" a na nic se nečeká) namísto "Type=Oneshot" (systemd čeká i na skončení skriptu v ExecStart).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.