[gelöst] Jessie/Mate/Autostartprogramme

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

[gelöst] Jessie/Mate/Autostartprogramme

Beitrag von Patsche » 20.02.2016 11:18:14

Hi,

ich habe hier ein Problem beim automatischen Start von Programmen mit Jessie und Mate. Ich nutzte hier Wiki-Artikel zum Thema PyLoad und starte dieses Programm als Deamon. Allerdings startet diesere Daemon erst, wenn ich mich angemeldet habe.
Beim Test mit Sid gibt es dieses Problem nicht.
Was habe ich bisher probiert:
1. Per GUI unter System -> Einstellungen -> Startprogramme einen Eintrag gemacht. (So funktioniert es auch mit Sid)
2. Über ein Skript welches ausführbar gemacht wurde und lediglich diese Zeilen enthält:

Code: Alles auswählen

#!/bin/bash
python /opt/pyload/pyLoadCore.py --daemon
Dieses Skript habe ich an folgenden Ort getestet abgelegt:
/usr/local/bin
3. Erstellung einer .desktop Datei mit folgendem Inhalt

Code: Alles auswählen

[Desktop Entry]
Type=Application
Exec=python /opt/pyload/pyLoadCore.py --daemon
Hidden=false
X-MATE-Autostart-enabled=false
Name[de_DE]=Pyloader
Name=Pyloader
Comment[de_DE]=
Comment=
Diese .desktop Date habe ich an folgenden Ort getestet abgelegt:
~/.config/autostart/
/etc/xdg/autostart/
Kann mir jemand helfen? Ich möchte mich nicht immer erst anmelden müssen, sondern einfach nur meine Downloads per Webinterface von überall einsehen und regeln können ohne erst eine ssh Sitzung starten zu müssen....
Zuletzt geändert von Patsche am 21.02.2016 01:02:33, insgesamt 1-mal geändert.

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 20.02.2016 14:23:31

Moin

Gibt es einen Grund, warum Du es nicht einfach beim Systemstart via unit starten lässt?

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: Jessie/Mate/Autostartprogramme

Beitrag von Patsche » 20.02.2016 18:41:16

TomL hat geschrieben:Gibt es einen Grund, warum Du es nicht einfach beim Systemstart via unit starten lässt?
Hey,

kannst du mir zeigen/erzählen, wie das geht? Ich kenne nur die Wege, die ich schgon genannt habe.

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 20.02.2016 20:32:50

Patsche hat geschrieben:kannst du mir zeigen/erzählen, wie das geht?
Na klar, das ist total easy. 8)

Du erstellst zuerst das Starter-Script, quasi einen Wrapper zum Start des Daemons:

Code: Alles auswählen

nano /usr/local/bin/pyLoadCoreDaemon

Code: Alles auswählen

#!/bin/bash
/bin/sleep 30
/usr/bin/python /opt/pyload/pyLoadCore.py --daemon
Lass auf jeden Fall den Sleep zur Start-Verzögerung drinstehen. Für den von dir beabsichtigten Zweck spielt es wirklich keine Rolle, ob ein Sicherheitszeitpuffer gewartet wird, bis das Netz verfügbar ist. Als nächstes legst Du eine Service-Unit an:

Code: Alles auswählen

nano /etc/systemd/system/pyLoadCoreDaemon.service

Code: Alles auswählen

[Unit]
Description=Startet pyLoadCore als Daemon
After=network.target

[Service]
RemainAfterExit=yes
ExecStart=/usr/local/bin/pyLoadCoreDaemon
User=patsche
Group=patsche

[Install]
WantedBy=multi-user.target
Jetzt muss das noch in Betrieb genommen werden: Rechte setzen, mit enable für den nächsten Systemstart aktivieren, einmal zur Fehlerkontrolle manuell starten und sofort kontrollieren... am Ende den reboot, um zu sehen, obs wirklich klappt.

Code: Alles auswählen

chown root:root /etc/systemd/system/pyLoadCoreDaemon.service
chmod 644 /etc/systemd/system/pyLoadCoreDaemon.service

chown root:root /usr/local/bin/pyLoadCoreDaemon
chmod 755 /usr/local/bin/pyLoadCoreDaemon

cd /etc/systemd/system
systemctl enable pyLoadCoreDaemon.service
systemctl start pyLoadCoreDaemon.service
systemctl status pyLoadCoreDaemon.service

/bin/systemctl reboot -i
Ein paar abschliessende Hinweise: Die beiden Namen für Unit und Wrapper kannst Du natürlich nach eigenem Geschmack vergeben. Aber nicht vergessen, "patsche" in der Unit auf Deinen tatsächlichen Usernamen zu ändern. Wenn der Daemon auch unter "root"-Account laufen kann, lösche einfach die 2 Zeilen User und Group. Und als letztes, "After=network.target" bedeutet nur, dass Deine Unit nach dem Netzwerk gestartet wird, aber nicht zwingend, dass das Netz schon verfügbar ist, wenn die Unit aufgerufen wird. Deswegen den Sleep 30... einfach um sicher zu sein, dass das Netz auch da ist. Man kann das auch eleganter prüfen, z.B. wie ich das mache, über eine eigene Unit "network_wait_online.service" - aber das ist hier in diesem Fall m.E. wirklich nicht notwendig.
Zuletzt geändert von TomL am 21.02.2016 00:14:29, insgesamt 4-mal geändert.

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: Jessie/Mate/Autostartprogramme

Beitrag von Patsche » 20.02.2016 21:16:44

Hi,

vielen Dank für die ausführliche Erklärung. Echt. Danke. Leider funktioniert es immer noch nicht. Ich habe auch mal nachgeguckt, was der Service nun nach 3 Minuten macht:

Code: Alles auswählen

systemctl status pyLoadCoreDaemon.service
● pyLoadCoreDaemon.service - Startet pyLoadCore als Daemon
   Loaded: loaded (/etc/systemd/system/pyLoadCoreDaemon.service; enabled)
   Active: inactive (dead) since Sa 2016-02-20 21:09:19 CET; 3min 17s ago
  Process: 672 ExecStart=/usr/local/bin/pyLoadCoreDaemon (code=exited, status=0/SUCCESS)
 Main PID: 672 (code=exited, status=0/SUCCESS)

Feb 20 21:09:19 Patsche pyLoadCoreDaemon[672]: Daemon PID 1867
Irgendwie ist er inaktiv, aber ich weiß nicht warum. Brauchst du weiter Angaben? Den User und Group hab ich auch entsprechend auf "marco" geändert....
Vielen Dank für die Hilfe.

Edit:

Hab den Service nochmal manuel gestartet, dann springt er sofort kurz auf "active" und dann wieder auf "inactive". Habe dann auch nochmal 30 Sek. gewartet:

Code: Alles auswählen

● pyLoadCoreDaemon.service - Startet pyLoadCore als Daemon
   Loaded: loaded (/etc/systemd/system/pyLoadCoreDaemon.service; enabled)
   Active: inactive (dead) since Sa 2016-02-20 21:17:20 CET; 34s ago
  Process: 2336 ExecStart=/usr/local/bin/pyLoadCoreDaemon (code=exited, status=0/SUCCESS)
 Main PID: 2336 (code=exited, status=0/SUCCESS)

Feb 20 21:17:20 Patsche pyLoadCoreDaemon[2336]: Daemon PID 2346

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 20.02.2016 21:35:28

Wieso steht denn in dem Code-Block jeweils als letzte Zeile "Patsche".... ?... ist das der CLI-Prompt? Wie heisst der angemeldete User...?... Patsche oder Marco? Gibt es da vielleicht Groß-Kleinschreib-Konflikte? An dem Punkt musst Du unbedingt für Eindeutigkeit sorgen. Unter welchem User soll das Programm laufen...?... der User muss natürlich im Linux angelegt sein, die Schreibweise muss übereinstimmen.

Wenn das mit den Anmelde- bzw. Account- bzw. User-Name klar ist, würde ich in dem Wrapper zum Testen mal den Daemon-Start mit '#' auskommentieren.... so das nur der Sleep gestartet wird. Zum Testen dann noch mal besser auf 60 Sekunden stellen, damit du nach dem Reboot Zeit genug hast, htop zu starten und den Job mit "pyl" zu filtern. Wenn also der Wrapper gestartet wird, sollte nun auch beim nächsten Start der Daemon gestartet werden, wenn Du den Comment-Tag wieder entfernst.

Füge unterhalb des Bash-Inits, direkt vor dem sleep, als erstes Kommando noch die folgende Zeile in den Wrapper ein:

Code: Alles auswählen

echo "Wrapper /usr/local/bin/pyLoadCoreDaemon gestartet!" | systemd-cat -t "marco:`basename $0`" -p warning
Du kannst dann nach dem Reboot prüfen, ob der Wrapper überhaupt angelaufen ist:

Code: Alles auswählen

journalctl | grep marco

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: Jessie/Mate/Autostartprogramme

Beitrag von Patsche » 20.02.2016 22:46:50

TomL hat geschrieben:"Patsche".... ?... ist das der CLI-Prompt?
Eigentlich nicht. Das gehört zur Ausgabe von

Code: Alles auswählen

root@Patsche:/home/marco# systemctl status pyLoadCoreDaemon.serviceapt install python
● pyLoadCoreDaemon.serviceapt.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

● install.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

● python.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
root@Patsche:/home/marco# systemctl status pyLoadCoreDaemon.service
● pyLoadCoreDaemon.service - Startet pyLoadCore als Daemon
   Loaded: loaded (/etc/systemd/system/pyLoadCoreDaemon.service; enabled)
   Active: inactive (dead) since Sa 2016-02-20 21:17:20 CET; 1h 28min ago
  Process: 2336 ExecStart=/usr/local/bin/pyLoadCoreDaemon (code=exited, status=0/SUCCESS)
 Main PID: 2336 (code=exited, status=0/SUCCESS)

Feb 20 21:17:20 Patsche pyLoadCoreDaemon[2336]: Daemon PID 2346
Der Hostname ist Patsche, also der Rechnername.
marco ist der Benutzername.

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 20.02.2016 22:56:18

Patsche hat geschrieben: Loaded: not-found (Reason: No such file or directory)
::::
Loaded: not-found (Reason: No such file or directory)
Vermutlich wird python beim Start nicht gefunden...weil Suchpfade zu dem Zeitpunkt nicht gesetzt sind:

Code: Alles auswählen

python /opt/pyload/pyLoadCore.py --daemon
Ändere es im Wrapper mal auf komplette Verzeichnisangaben:

Code: Alles auswählen

/bin/sleep 30
/usr/bin/python /opt/pyload/pyLoadCore.py --daemon
Sorry... Nachtrag... was schreib ich denn da.... :facepalm: ... muss wohl Deine Postings besser lesen....was issen das für ein merkwürdiger Befeh?

Code: Alles auswählen

systemctl status pyLoadCoreDaemon.serviceapt install python
Was passiert bei manuellem Start?

Code: Alles auswählen

systemctl start pyLoadCoreDaemon.service
Wie ist dann die Ausgabe von?

Code: Alles auswählen

systemctl status pyLoadCoreDaemon.service
Wenn die Service-Unit "tot" ist, was passiert, wenn Du den Wrapper von Hand startest?

Code: Alles auswählen

/usr/local/bin/pyLoadCoreDaemon

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: Jessie/Mate/Autostartprogramme

Beitrag von Patsche » 20.02.2016 23:42:46

TomL hat geschrieben:Sorry... Nachtrag... was schreib ich denn da.... :facepalm:
Kein Problem. Passiert ;)
TomL hat geschrieben:was issen das für ein merkwürdiger Befeh?

Code: Alles auswählen

systemctl status pyLoadCoreDaemon.serviceapt install python
Ist ein Vertipper. Habe die Bash-History benutzt gehabt. War keine Absicht.
TomL hat geschrieben:Was passiert bei manuellem Start?
Der Service ist für 30 Sek. aktiv

Code: Alles auswählen

root@Patsche:/home/marco# systemctl status pyLoadCoreDaemon.service
● pyLoadCoreDaemon.service - Startet pyLoadCore als Daemon
   Loaded: loaded (/etc/systemd/system/pyLoadCoreDaemon.service; enabled)
   Active: active (running) since Sa 2016-02-20 23:31:03 CET; 29s ago
 Main PID: 4129 (pyLoadCoreDaemo)
   CGroup: /system.slice/pyLoadCoreDaemon.service
           ├─4129 /bin/bash /usr/local/bin/pyLoadCoreDaemon
           └─4130 sleep 30
Danach stirbt er

Code: Alles auswählen

root@Patsche:/home/marco# systemctl status pyLoadCoreDaemon.service
● pyLoadCoreDaemon.service - Startet pyLoadCore als Daemon
   Loaded: loaded (/etc/systemd/system/pyLoadCoreDaemon.service; enabled)
   Active: inactive (dead) since Sa 2016-02-20 23:31:33 CET; 46ms ago
  Process: 4129 ExecStart=/usr/local/bin/pyLoadCoreDaemon (code=exited, status=0/SUCCESS)
 Main PID: 4129 (code=exited, status=0/SUCCESS)

Feb 20 23:31:33 Patsche pyLoadCoreDaemon[4129]: Daemon PID 4170
TomL hat geschrieben:Wenn die Service-Unit "tot" ist, was passiert, wenn Du den Wrapper von Hand startest?
Dann läuft. Habe den Service als Benutzer marco ausgeführt.

Code: Alles auswählen

marco@Patsche:~$ /usr/local/bin/pyLoadCoreDaemon
Daemon PID 4202

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 21.02.2016 00:19:24

Ok... ich habe das vorhin bei mir nur in einer VM guick&dirty gemacht... natürlich ohne Daemon, nur mit dem sleep - quasi als oneshot. Das klappte auf Anhieb. Ich habe das jetzt nicht als so wichtig erachtet, aber vermutlich/anscheinend beendet systemd den Daemon wieder, wenn alle Dienste gestartet sind. Trage einfach noch mal

Code: Alles auswählen

RemainAfterExit=yes
in die Service-Unit ein.... so wie ich das oben in der Unit im Posting ebenfalls korrigiert habe.
Zuletzt geändert von TomL am 21.02.2016 00:22:32, insgesamt 1-mal geändert.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Jessie/Mate/Autostartprogramme

Beitrag von NAB » 21.02.2016 00:22:18

Ehm ... wäre es nicht einfacher, direkt in der Unit den eigentlichen Service "/usr/bin/python /opt/pyload/pyLoadCore.py --daemon" zu starten?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 21.02.2016 00:25:27

NAB hat geschrieben:Ehm ... wäre es nicht einfacher, direkt in der Unit den eigentlichen Service "/usr/bin/python /opt/pyload/pyLoadCore.py --daemon" zu starten?
Ja, natürlich. Ich bin nur bei vom Netz abhängigen Programmen vorsichtig. Was passiert, wenn der Daemon merkt "Netz ist (noch) nicht da"? Wenn er sich dann einfach beendet oder inaktiv wird, wars auch erfolglos. Ich kenne sein Verhalten nicht und bin einfach auf Sicherheit gegangen. Der Wrapper verzögert den Start also ein bisschen, bis das Netz definitiv da ist.

Um da sicher zu sein, brauchts dann noch eine weitere Unit, die ich so in meine Unit übernommen haben. Auf diese weise brauche ich keinen "sleep". Aber das wollte ich mir jetzt sparen.

Code: Alles auswählen

After=network_wait_online.service
Requires=network_wait_online.service

Benutzeravatar
Patsche
Beiträge: 3262
Registriert: 21.06.2013 01:47:54
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: /home/10001101001

Re: Jessie/Mate/Autostartprogramme

Beitrag von Patsche » 21.02.2016 01:02:14

TomL hat geschrieben:

Code: Alles auswählen

RemainAfterExit=yes
Das war es. Jetzt funktioniert es. Komisch ist es aber trotzdem, dass alle meine Versuche aus dem 1. Post nicht geklappt haben, obwohl sie in Sid funktionieren....Naja. Jetzt läuft es ja und ich hab wieder was dazu gelernt.
Vielen Dank TomL für deine Hilfe :THX:

TomL

Re: Jessie/Mate/Autostartprogramme

Beitrag von TomL » 21.02.2016 11:14:24

Patsche hat geschrieben:Das war es. Jetzt funktioniert es.
Prima, das freut mich :)

Jetzt mach noch mal was neues....ist nämlich auch echt spannend.... einfach mal kontrollieren, wo Deine neue Unit eingehängt ist:

Code: Alles auswählen

systemd-analyze plot >~/Downloads/boot.svg
Das Ergebnis schau Dir mit einem Picture-Viewer an, z.B. mit xnView, oder Pinta... ich nutze dafür gpicview. Und achte mal genau auf die relative Position zu network.target und network-online.target.... und ggf. durch parallele Starts auf zeitliche Überlappungen. Deswegen auch der Wrapper mit dem Toleranz-Sleep. Hier mal ein Beispiel-Schnippsel von meinem Rechner:

http://www.directupload.net/file/d/4271 ... aq_png.htm
  • Netzwerk wird gestartet (networking.service (oben am Anfang))
  • danach signalisiert network.target "ist gestartet"
  • network-online.target behauptet "ist online". Das bedeutet aber nur, dass das Netz verbunden ist, aber nicht, dass z.B. eine IP via DHCP vergeben ist
  • Meine Unit "network_wait_online_service" braucht also immer noch 2 Sekunden, bis der Rechner tatsächlich Online ist und via DHCP-Server eine IP vergeben wurde
  • Und erst jetzt, wenn der Rechner online ist und mein Server überhaupt gefunden werden kann, wird meine Unit "mountctrl" (ganz unten, am Ende) zum Verbinden der Netz-Mounts gestartet
Ich finde systemd und die damit einhergehenden Möglichkeiten einfach genial..... :THX: :D

Antworten