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.


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"

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"

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.