Gibt es eine einfache Möglichkeit, ein FreeBSD-RC-Skript zu erstellen?

9

Ich habe ein FreeBSD-Gefängnis, in dem ich einen Server mit dem folgenden Befehl ausführe:

/usr/sbin/daemon /path/to/script.py

Im Moment muss ich diesen Befehl jedes Mal ausführen, wenn ich den Computer neu starte und das Gefängnis startet. Ich möchte, dass dieser Befehl von gestartet wird /etc/rc. Gibt es eine einfache Möglichkeit, ein FreeBSD-RC-Skript für einen daemonBefehl zu erstellen ?


UPDATE: Ich habe diese BSD-Dokumentation über RC-Skripte gelesen und daraus das folgende Skript erstellt /etc/rc.d/pytivo:

#!/bin/sh

. /etc/rc.subr

name=pytivo
rcvar=pytivo_enable
procname="/usr/local/pytivo/pyTivo.py"

command="/usr/sbin/daemon -u jnet $procname"

load_rc_config $name
run_rc_command "$1"

Dies funktioniert, um das Python-Skript zu starten, das ich als Daemon möchte, wenn das Gefängnis startet ... (angegeben pytivo_enable="YES"ist in /etc/rc.conf), aber das RC-Skript weiß nicht, ob der Daemon ausgeführt wird (es glaubt, dass es nicht ist, wenn es ist) und Es gibt eine Warnung, wenn ich versuche, es zu starten:

[root@meryl /home/jnet]# /etc/rc.d/pytivo start
[: /usr/sbin/daemon: unexpected operator
Starting pytivo.
[root@meryl /home/jnet]# 

Es ist also nah dran und es funktioniert , aber ich denke, ich sollte in der Lage sein, bessere Funktionen als diese zu erhalten.

Josh
quelle
Sie müssen dieses Skript irgendwo platzieren (kann mich jetzt nicht erinnern) und eine Zeile XX_enable="YES"in /etc/rc.conf einfügen, damit es automatisch gestartet wird. Beginnen Sie mit der Suche nach vorhandenen Skripten
Gänseblümchen
Ich suche nach einer einfachen Möglichkeit, das Skript zu erstellen ... Gibt es ein gutes Skript, das ich kopieren und wiederverwenden kann?
Josh

Antworten:

11

commandsollte nicht mehrere Wörter enthalten. Dies ist die Ursache für den [angezeigten Fehler. Sie sollten alle Flags separat setzen.

Außerdem sollten Sie verwenden pytivo_user, um die laufende UID festzulegen, und nicht daemon -u. Alle diese magischen Variablen finden Sie in der Manpage rc.subr (8) .

Außerdem sollten Sie das rc-Subsystem darüber informieren, dass pytivo ein Python-Skript ist, damit es den Prozess finden kann, wenn es prüft, ob er ausgeführt wird.

Schließlich sollten Sie die Redewendung set_rcvarfür verwenden rcvar.

So etwas (ich bin mir nicht sicher, ob dies der richtige Python-Pfad ist):

#!/bin/sh

# REQUIRE: LOGIN

. /etc/rc.subr

name=pytivo
rcvar=`set_rcvar`
command=/usr/local/pytivo/pyTivo.py
command_interpreter=/usr/local/bin/python
pytivo_user=jnet
start_cmd="/usr/sbin/daemon -u $pytivo_user $command"

load_rc_config $name
run_rc_command "$1"
Aecolley
quelle
Das Problem ist, dass usr/local/pytivo/pyTivo.py es nicht dämonisiert , daher /usr/bin/daemonwerde ich ohne Aufruf den Befehl nur im Vordergrund ausführen, wenn ich ihn ausführe/etc/rc.d/pytivo start
Josh,
Dies korrigiert jedoch die Befehle statusund stop!
Josh
Oh, das Skript dämonisiert nicht? Ich denke, die einfachste Lösung ist, start_cmdvor dem Anruf load_rc_configstart_cmd="/usr/sbin/daemon -u $pytivo_user $command"
festzulegen
Dies hatte die Magie, die ich brauchte, um mein Skript zum Laufen zu bringen. Vielen Dank!
Dave Martorana
0

Wenn Sie kein RC-Skript benötigen, können Sie nur /etc/rc.local verwenden.

Für Ihr RC-Skript fehlen abhängige Kommentare, mindestens eine Zeile

# REQUIRE: LOGIN

sollte helfen, dass es zum richtigen Zeitpunkt ausgeführt wird.

Möglicherweise müssen Sie auch eine PID-Datei definieren

pytivo_pidfile="/path/to/your/pidfile"
gebogen
quelle
Ich hatte die Hoffnung, dass dies helfen würde, aber das tut es nicht. Ich bekomme immer noch : /usr/sbin/daemon: unexpected operatorund mein RC-Skript weiß immer noch nicht, ob das Skript tatsächlich ausgeführt wird.
Josh
Sie könnten versuchen, das Skript mit -x aufzurufen, um zu sehen, welcher Befehl fehlschlägt
am