Existe-t-il un moyen simple de créer un script rc FreeBSD?

9

J'ai une prison FreeBSD dans laquelle j'exécute un serveur en utilisant la commande:

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

Pour le moment, je dois exécuter cette commande chaque fois que je redémarre la machine et que la prison démarre. J'aimerais que cette commande démarre /etc/rc. Existe-t-il un moyen simple de créer un script rc FreeBSD pour une daemoncommande?


MISE À JOUR: J'ai lu cette documentation BSD sur les scripts rc , et à partir de là j'ai créé le script suivant dans /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"

Cela fonctionne pour démarrer le script python que je veux en tant que démon lorsque la prison démarre ... (donné pytivo_enable="YES"est /etc/rc.confdedans) mais le script rc ne sait pas si le démon est en cours d'exécution (il pense que ce n'est pas le cas) et il donne un avertissement lorsque j'essaie de le démarrer:

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

C'est donc proche , et cela fonctionne , mais je pense que je devrais être en mesure d'obtenir de meilleures fonctionnalités que cela.

Josh
la source
Vous devez mettre ce script quelque part (je ne me souviens plus maintenant) et mettre une ligne XX_enable="YES"dans /etc/rc.conf pour le faire démarrer automatiquement. Commencez par trouver les scripts existants
daisy
Je cherche un moyen facile de créer le script ... Y a-t-il un bon script que je peux copier et réutiliser?
Josh

Réponses:

11

commandne doit pas contenir plusieurs mots. C'est la cause de l' [erreur que vous voyez. Vous devez définir tous les drapeaux séparément.

En outre, vous devez utiliser pytivo_userpour définir l'uid en cours d'exécution, et non daemon -u. Consultez la page de manuel rc.subr (8) pour toutes ces variables magiques.

En outre, vous devez informer le sous-système rc que pytivo est un script Python afin qu'il puisse trouver le processus lorsqu'il vérifie s'il fonctionne.

Enfin, vous devez utiliser l'idiomatique set_rcvarpour rcvar.

Quelque chose comme ça (je ne suis pas sûr que ce soit le bon chemin Python):

#!/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
la source
Le problème est que usr/local/pytivo/pyTivo.py cela ne démonifie pas , donc sans appeler, /usr/bin/daemonje vais juste exécuter la commande dans le premier plan lorsque je cours/etc/rc.d/pytivo start
Josh
Cependant, cela corrige les commandes statuset stop!
Josh
Oh, le script ne démonifie pas? Je pense que la solution la plus simple est de régler start_cmdavant d'appeler load_rc_config:start_cmd="/usr/sbin/daemon -u $pytivo_user $command"
aecolley
Cela avait la magie dont j'avais besoin pour exécuter mon script. Merci!
Dave Martorana
0

Si vous n'avez pas besoin d'un script rc, vous pouvez utiliser simplement /etc/rc.local.

Pour votre script rc il vous manque des commentaires dépendants, au moins une ligne

# REQUIRE: LOGIN

devrait aider, qu'il est exécuté au bon moment.

Vous devrez peut-être également définir un fichier pid

pytivo_pidfile="/path/to/your/pidfile"
arved
la source
J'espérais que cela aiderait, mais ce n'est pas le cas. J'obtiens toujours : /usr/sbin/daemon: unexpected operatoret mon script rc ne sait toujours pas si le script est réellement en cours d'exécution.
Josh
vous pouvez essayer d'appeler le script avec -x pour voir quelle commande échoue
arved