Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: MaBo 09. 11. 2021, 18:54:51

Název: Python skript při startu ubuntu
Přispěvatel: 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.
Název: Re:Python skript při startu ubuntu
Přispěvatel: _Jenda 09. 11. 2021, 19:23:56
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:
Kód: [Vybrat]
# /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:
Kód: [Vybrat]
ExecStart=/usr/bin/screen -L -S mujskript -Dm /root/mujskript.py
Při unlock bych dal do /etc/pam.d/xscreensaver:
Kód: [Vybrat]
auth sufficient pam_exec.so expose_authtok quiet seteuid /blabla/mujskript.shpokud ubuntí odemykání používá xscreensaver. Skript musí skončit, jinak se neodemkne.
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 09. 11. 2021, 20:56:06
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.
Název: Re:Python skript při startu ubuntu
Přispěvatel: _Jenda 09. 11. 2021, 21:45:56
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.
Název: Re:Python skript při startu ubuntu
Přispěvatel: Ink 10. 11. 2021, 10:34:05
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
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 10. 11. 2021, 12:53:17
Díky za link; bude se mi to hodit.

M.B.
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 11. 11. 2021, 20:17:30
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.
Název: Re:Python skript při startu ubuntu
Přispěvatel: k3dAR 11. 11. 2021, 20:45:16
[...] 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
?
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 11. 11. 2021, 21:14:50
Ano, mám to tam.
Název: Re:Python skript při startu ubuntu
Přispěvatel: _Jenda 11. 11. 2021, 21:30:09
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).
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 11. 11. 2021, 22:49:28
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)
Název: Re:Python skript při startu ubuntu
Přispěvatel: _Jenda 12. 11. 2021, 04:08:05
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.
Název: Re:Python skript při startu ubuntu
Přispěvatel: Ink 12. 11. 2021, 07:24:20
BTW, není UTF-8 v Pythonu teď default? Aha, sorry, napsal už Jenda.
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 12. 11. 2021, 12:27:40
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.

Název: Re:Python skript při startu ubuntu
Přispěvatel: listoper 12. 11. 2021, 12:59:24
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)
Název: Re:Python skript při startu ubuntu
Přispěvatel: MaBo 12. 11. 2021, 21:37:59
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.
Název: Re:Python skript při startu ubuntu
Přispěvatel: BoneFlute 14. 11. 2021, 16:22:14
Moc díky za typ.

Kód: [Vybrat]
import pyautogui
A já děkuji za typ na tohle. To jsem neznal, to se bude hodit.