Python skript při startu ubuntu

MaBo

Python skript při startu ubuntu
« kdy: 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.


_Jenda

  • *****
  • 1 605
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #1 kdy: 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.

MaBo

Re:Python skript při startu ubuntu
« Odpověď #2 kdy: 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.

_Jenda

  • *****
  • 1 605
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #3 kdy: 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.

Ink

  • *****
  • 669
    • Zobrazit profil
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #4 kdy: 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


MaBo

Re:Python skript při startu ubuntu
« Odpověď #5 kdy: 10. 11. 2021, 12:53:17 »
Díky za link; bude se mi to hodit.

M.B.

MaBo

Re:Python skript při startu ubuntu
« Odpověď #6 kdy: 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.

k3dAR

  • *****
  • 3 045
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #7 kdy: 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
?

MaBo

Re:Python skript při startu ubuntu
« Odpověď #8 kdy: 11. 11. 2021, 21:14:50 »
Ano, mám to tam.

_Jenda

  • *****
  • 1 605
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #9 kdy: 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).

MaBo

Re:Python skript při startu ubuntu
« Odpověď #10 kdy: 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)

_Jenda

  • *****
  • 1 605
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #11 kdy: 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.

Ink

  • *****
  • 669
    • Zobrazit profil
    • E-mail
Re:Python skript při startu ubuntu
« Odpověď #12 kdy: 12. 11. 2021, 07:24:20 »
BTW, není UTF-8 v Pythonu teď default? Aha, sorry, napsal už Jenda.

MaBo

Re:Python skript při startu ubuntu
« Odpověď #13 kdy: 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.