Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: MaBo 09. 11. 2021, 18:54:51
-
Dobrý den, chci se zeptat, jaká je nejlepší cesta, způsob, jak automaticky startovat python skript při startu systému (ubuntu 21.10) a při unlock.
Moc díky za každou odpověď
M.B.
-
Pokud je to jednorázový skript, tak bych ho dal do /etc/rc.local (v Debianu stačí vytvořit a nastavit +x). Pokud má běžet trvale, tak bych mu udělal unitu:
# /etc/systemd/system/mujskript.service
[Unit]
Description=mujskript
[Service]
Type=simple
User=root
ExecStart=/root/mujskript.py
WorkingDirectory=/root
[Install]
WantedBy=multi-user.target
# systemctl enable mujskript
Pokud s ním chceš interagovat a nestačí ti defaultní logování, tak bych ho spustil ve screenu:
ExecStart=/usr/bin/screen -L -S mujskript -Dm /root/mujskript.py
Při unlock bych dal do /etc/pam.d/xscreensaver:
auth sufficient pam_exec.so expose_authtok quiet seteuid /blabla/mujskript.sh
pokud ubuntí odemykání používá xscreensaver. Skript musí skončit, jinak se neodemkne.
-
Moc díky za odpověď. Takže to bude něco jako vytvoření daemon? Jinak, zatím neplánuji nějakou interakci se skriptem a vyzkouším to, co jste mi poradil.
M.B.
-
Moc díky za odpověď. Takže to bude něco jako vytvoření daemon?
Démon se myslím říkalo, když se program hodil na pozadí a odpojil si stdin a stdout a zařídil, aby shell, který ho spouštěl, mohl skončit. Možná hlavním přínosem systemd je, že tohle není potřeba, takže nevím, jestli se tomu pak má říkat démon.
-
Moc díky za odpověď. Takže to bude něco jako vytvoření daemon?
Démon se myslím říkalo, když se program hodil na pozadí a odpojil si stdin a stdout a zařídil, aby shell, který ho spouštěl, mohl skončit. Možná hlavním přínosem systemd je, že tohle není potřeba, takže nevím, jestli se tomu pak má říkat démon.
IMO tohle dělá SystemD za Tebe, takže to démon je. Říkají tomu New-Style Daemons: https://www.freedesktop.org/software/systemd/man/daemon.html
-
Díky za link; bude se mi to hodit.
M.B.
-
Ještě dotaz: výstup kontroly .service souboru je
systemd[1]: Starting test_asist...
systemd[958]: test_asist.service: Failed to execute /root/test_asist.py: Exec format error
systemd[958]: test_asist.service: Failed at step EXEC spawning /root/test_asist.py: Exec format error
systemd[1]: test_asist.service: Control process exited, code=exited, status=203/EXEC
systemd[1]: test_asist.service: Failed with result 'exit-code'.
systemd[1]: Failed to start test_asist.
.py má nastaveno chmod a+x test_asist.py
Chápu to správně, že .py soubor v root neodpovídá Exec formátu? Pokud je to pravda, má mít daemon .py skript nějaký odlišný shebang nebo jiné zvláštní paramentry?
M.B.
-
[...] má mít daemon .py skript nějaký odlišný shebang [...]
odlisny nez co? mas tam neco jako:
#!/usr/bin/python3
ci
#!/usr/bin/env python3
?
-
Ano, mám to tam.
-
A ručně ti to funguje? (systemctl start test_asist) Je něco v systemctl status test_asist a journalctl -u test_asist? A spustit přímo ten skript přímo z terminálu předpokládám funguje?
Někde na internetu explicitně volali interpret (/usr/bin/python3 /root/test_asist.py).
-
Moc díky za typ.
systemctl start test_asist.service
Job for test_asist.service failed because the control process exited with error code.
Mám blbě skript, ale nemám ponětí, v čem. Normálně ale z python test_asist.py funguje. Jen jsem měl takovou ideu, že by se to mohlo spouštět při boot.
# -*- coding: utf-8 -*-
# !/usr/bin/python3
import pyautogui, os
from PIL import Image
import schedule
import time
def pauza():
pyautogui.alert("Ulož si to! Za chvíli přijde pauza!",title="Výzva k uložení") # viz modul pyautogui
im = Image.open('1.jpg') # viz modul PIL a Image
im.show()
def konec():
return pyautogui.alert("Ulož si to! Za chvíli přijde KONEC!",title="Výzva k uložení")
def shut():
return os.system("shutdown now -h")
schedule.every(45).to(60).minutes.do(pauza)
schedule.every().day.at('20:55').do(konec)
schedule.every().day.at('21:00').do(shut)
while True:
schedule.run_pending()
time.sleep(1)
-
Hashbang musí být první věc v souboru, kernel (teda, dělá to kernel?) přece nebude parsovat nějaké řádky jestli náhodou někde něco není. A jinak utf8 je snad v Pythonu 3 už default.
-
BTW, není UTF-8 v Pythonu teď default? Aha, sorry, napsal už Jenda.
-
Opět jsem se posunul: upravil jsem test_asist.service na:
[Unit]
Description=test_asist
After=syslog.target
After=network.target
[Service]
Type=simple
User=marcel
RemainAfterExit=yes
Restart=on-failure
RestartSec=10s
ExecStart=/usr/bin/python3 /home/marcel/Plocha/marcel_backup/python/test_asist/test_asist.py
TimeoutSec=300
[Install]
WantedBy=multi-user.target
...
systemctl status test_asist.service
● test_asist.service - test_asist
Loaded: loaded (/etc/systemd/system/test_asist.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Fri 2021-11-12 12:26:22 CET; 758ms ago
Process: 10815 ExecStart=/usr/bin/python3 /home/marcel/Plocha/marcel_backup/python/test_asist/test_asist.py (code=exited, status=1/FAILURE)
Main PID: 10815 (code=exited, status=1/FAILURE)
CPU: 206ms
...
Ale v journalctl -e -u test_asist.service se objeví:
python3[9709]: File "/usr/lib/python3.9/os.py", line 679, in __getitem__
python3[9709]: raise KeyError(key) from None
python3[9709]: KeyError: 'DISPLAY'
systemd[1]: test_asist.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: test_asist.service: Failed with result 'exit-code'.
Znamená to, že kdybych se neodkazoval .py souboru na os a pyautogui, vše by fungovalo? Tedy že by daemon měl problém s GUI výstupem pyautogui.alert(...)? Anebo journalctl tím říká něco úplně jiného?
M.B.
-
Mozna pomuze tohle: https://unix.stackexchange.com/questions/85244/setting-display-in-systemd-service-file (https://unix.stackexchange.com/questions/85244/setting-display-in-systemd-service-file)
-
Díky za link. Po rúzných peripetiích jsem postupně z .py skriptu odebral všechno, co souvisí s gui, a .service funguje:
● test_asist.service - test_asist
Loaded: loaded (/etc/systemd/system/test_asist.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-11-12 17:27:56 CET; 5min ago
Main PID: 1030 (python)
Začínám chápat, jak to vlastně funguje a to je největší bonus.
-
Moc díky za typ.
import pyautogui
A já děkuji za typ na tohle. To jsem neznal, to se bude hodit.