Anwendungen über @reboot crontab starten als wäre man direkt "da"

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
lilan
Beiträge: 4
Registriert: 13.08.2022 07:45:01

Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von lilan » 17.12.2022 01:31:19

Hallo zusammen,

zur Zeit mache ich folgendes:

- Ich logge mich als User (ohne root) ein.
- starte einen screen
- und starte bspw. ein Node Script, welches einen Server Port über 3000 öffnet

Ich würde gerne diesen Ablauf automatisieren.

Dazu erstellte ich mich mir ein Script, welches im Kopf #!/bin/bash und dann gleich via screen direkt das NodeScript startet.

Das Script hat natürlich ausführrecht und funktioniert auch direkt in der Console ohne Probleme.


Doch starte ich das System mal neu, passiert leider nichts :-/

Jetzt bin ich total am rätseln, woran das nur liegen kann.

Gibt es irgendwelche Parameter die man in oder vor Screen irgenwie festlegen muss?

@reboot ~/node.sh

chmod +x ~/node.sh #:
#!/bin/bash
cd ~/web/
screen node server/server.js

Benutzeravatar
cosinus
Beiträge: 3423
Registriert: 08.02.2016 13:44:11
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Bremen

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von cosinus » 17.12.2022 03:49:59

Und nun mal langsam und von vorn. Was genau trägst du bitte wo ein?
Wäre vllt die /etc/rc.local was für dich? :)

lilan
Beiträge: 4
Registriert: 13.08.2022 07:45:01

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von lilan » 17.12.2022 08:58:32

cosinus hat geschrieben: ↑ zum Beitrag ↑
17.12.2022 03:49:59
Und nun mal langsam und von vorn. Was genau trägst du bitte wo ein?
Wäre vllt die /etc/rc.local was für dich? :)
in die "crontab -e" damit es nach einem Neustart automatisch neu gestartet wird (bzw. soll).

Mit Simplen Befehlen bzw. Scripten klappt das prima, doch hier fehlt irgendwas leider.

Das ist leider ein Problem, auf welches ich immer wiedere Stoße. Nicht nur mit NodeJS.

Ich vermute man muss nur irgendeine Datei vielleicht einlesen, bevor man in dem Fall Node startet und schon läuft alles prima.

. /etc/rc.local ist es leider nicht :-(


PS: Das ganze natürlich ohne root-Rechte, da das Script ja auch nicht ausbrechen können darf.

chrbr
Beiträge: 550
Registriert: 29.10.2022 15:53:26

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von chrbr » 17.12.2022 10:09:27

Was auch oft hilft, ist die Programme mit dem kompletten Pfad einzutragen. Damit fängt man Probleme durch unterschiedliche Environment Einstellungen in der Login Shell und dem crontab Environment ab.

mat6937
Beiträge: 2953
Registriert: 09.12.2014 10:44:00

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von mat6937 » 17.12.2022 10:39:04

lilan hat geschrieben: ↑ zum Beitrag ↑
17.12.2022 08:58:32
Ich vermute man muss nur irgendeine Datei vielleicht einlesen, bevor man in dem Fall Node startet und schon läuft alles prima.
Versuch mal mit wirksamem:

Code: Alles auswählen

net.ipv4.ip_nonlocal_bind = 1
net.ipv6.ip_nonlocal_bind = 1
in der /etc/sysctl.conf (oder gleichwertig). Und wenn das nicht hilft, dann starte dein Script mit einer deaktivierten (usereigenen) service-unit (die Du noch schreiben musst) und diese deaktivierte service-unit startest Du 45 Sekunden nach erfolgtem booten, mit einer timer-unit (die Du auch noch schreiben musst).

EDIT:

BTW: Voraussetzung ist, dass dein Script so geschrieben/konzipiert ist, dass es auch mit Hilfe einer service-unit gestartet werden kann.

Benutzeravatar
MSfree
Beiträge: 10752
Registriert: 25.09.2007 19:59:30

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von MSfree » 17.12.2022 13:11:54

  1. cron ist die falsche Stelle, um Programme und/oder Skritpe beim Booten zu starten. Nur, weil cron es trotzdem anbietet, ist es noch immer nicht das richtige Vorgehen.
  2. rc.local würde funktionieren, ist aber ein veraltetes Konzept.
  3. Systemdienste startet man heutzutage über systemd (früher über SysV-Init).
  4. Zu startende Programme/Skripte sind immer mit vollem Pfad anzugeben, sonst findet dein System sie nicht.
So etwas wie

Code: Alles auswählen

cd ~/web/
kann nicht funktionieren. Woher soll das System denn wissen, auf welchen Benutzer sich "~" bezieht?

Code: Alles auswählen

cd /home/lilan/web
geht aber.

Warum willst du denn das Script in "screen" starten? Bei Nutzung einer Systemd-Unit ist das überflüssig. Auch die Angabe eines Benutzeres, unter dem das Programm/Skript laufen soll, ist hier möglich.

Man kann auch spezifizieren, daß solche Programm/Skript erst gestartet werden, wenn bestimmte Voraussetzungen gegeben sind. Z.B. wäre ers sinnvoll, dein Skript erst zu starten, wenn das Netzwerk hochgefahren ist. Der Einbau von Warteschleifen (z.B. mit sleep) erübrigt sich dann komplett, was letzten Endes zuverlässig ist, sleeps sind es hingegen überhaupt nicht.

Der Inhalt einer systemd-unit könnte so aussehen:

Code: Alles auswählen

[Unit]
Description=Node JS Dienst
After=network.target

[Service]
User=lilan
Group=lilan
ExecStart=/usr/bin/node /home/lilan/web/server/server.js
Type=simple
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target

lilan
Beiträge: 4
Registriert: 13.08.2022 07:45:01

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von lilan » 24.12.2022 23:59:05

MSfree hat geschrieben: ↑ zum Beitrag ↑
17.12.2022 13:11:54
...
Warum willst du denn das Script in "screen" starten? Bei Nutzung einer Systemd-Unit ist das überflüssig. Auch die Angabe eines Benutzeres, unter dem das Programm/Skript laufen soll, ist hier möglich.
Weil ich ungefähr 8 Dienste benutze, welche alle auch über mehrere Screens starten.

Einige davon muss ich manchmal pausieren/stoppen.. in den Debugmodus umschalten.. und dann wieder in "Produktiv" umschalten.

Würde das als Daemon laufen, müsste ich aufwendig log-Dateien sichten und benötige bei Problemen deutlich mehr Zeit.


Es suche deshalb eine Lösung, wie ich es einfach als Screen von Crontab aus starten kann.

Dazu braucht man nicht mal root-Rechte, was ich als deutlichen Vorteil sehe. (was man für den Daemon auch benötigt)


Darunter fallen NodeJS (in vers. NodeJS-Version, hier herscht leider echt Chaos :-/), ein paar Python-Webserver auf vers. Ports und einige Monitortools.

Benutzeravatar
cosinus
Beiträge: 3423
Registriert: 08.02.2016 13:44:11
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Bremen

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von cosinus » 28.12.2022 23:10:30

MSfree hat geschrieben: ↑ zum Beitrag ↑
17.12.2022 13:11:54
rc.local würde funktionieren, ist aber ein veraltetes Konzept.
Naja. Soooo veraltet ist das auch nicht, immerhin wird das noch per systemd verwaltet. Man muss den Dienst doch nur aktivieren.

Benutzeravatar
jph
Beiträge: 1049
Registriert: 06.12.2015 15:06:07
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Greven/Westf.

Re: Anwendungen über @reboot crontab starten als wäre man direkt "da"

Beitrag von jph » 29.12.2022 12:38:25

Einer von vielen richtigen Lösungswegen:
  • systemd-User-Unit zum Start des Servers anlegen und in ~/.config/systemd/user/ ablegen, Anleitung siehe $ man systemd.unit
  • systemd mitteilen, dass die neue Unit vorliegt: $ systemctl daemon-reload --user
  • Unit aktivieren und unmittelbar starten: $ systemctl enable --user --now <unit>
  • Über # loginctl enable-linger <user> dem User das Herumlungern erlauben.
Fertig.

Antworten