Existe uma maneira fácil de criar um script rc do FreeBSD?

9

Eu tenho uma prisão do FreeBSD na qual eu executo um servidor usando o comando:

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

No momento, tenho que executar esse comando toda vez que reinicio a máquina e a cadeia é iniciada. Eu gostaria de ter esse comando iniciado /etc/rc. Existe uma maneira fácil de criar um script rc do FreeBSD para um daemoncomando?


ATUALIZAÇÃO: Li esta documentação do BSD sobre scripts rc e a partir disso criei o seguinte script em /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"

Isso funciona para iniciar o script python que eu estou querendo como daemon quando a cadeia começa ... (dado pytivo_enable="YES"está em /etc/rc.conf), mas o script rc não sabe se o daemon está em execução (ele pensa que não está quando está) e emite um aviso quando tento iniciá-lo:

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

Portanto, está próximo e funciona , mas sinto que devo conseguir uma funcionalidade melhor que essa.

Josh
fonte
Você precisa colocar esse script em algum lugar (Não me lembro agora) e colocar uma linha XX_enable="YES"no /etc/rc.conf para iniciar automaticamente. Comece encontrando scripts existentes
daisy
Estou procurando uma maneira fácil de criar o script ... Existe um bom script que eu possa copiar e reutilizar?
21412 Josh

Respostas:

11

commandnão deve conter várias palavras. Essa é a causa do [erro que você vê. Você deve definir qualquer sinalizador separadamente.

Além disso, você deve usar pytivo_userpara definir o uid em execução, e não daemon -u. Veja a página de manual do rc.subr (8) para todas essas variáveis ​​mágicas.

Além disso, você deve informar ao subsistema rc que pytivo é um script Python para que ele possa encontrar o processo ao verificar se está em execução.

Finalmente, você deve usar o idiomático set_rcvarpara rcvar.

Algo assim (não tenho certeza se esse é o caminho correto do 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
fonte
O problema é que usr/local/pytivo/pyTivo.py não daemonize , portanto, sem chamar /usr/bin/daemoneu vou só pegar o comando em execução no forground quando eu corro/etc/rc.d/pytivo start
Josh
No entanto, isso corrige os comandos statuse stop!
21712 Josh
Oh, o script não daemonize? Eu acho que a solução mais fácil é definir start_cmdantes de ligar load_rc_config:start_cmd="/usr/sbin/daemon -u $pytivo_user $command"
aecolley
Isso tinha a magia que eu precisava para executar meu script. Obrigado!
Dave Martorana
0

Se você não precisa de um script rc, pode usar apenas /etc/rc.local.

Para o seu script rc, faltam comentários dependentes, pelo menos uma linha

# REQUIRE: LOGIN

deve ajudar, que seja executado no momento certo.

Você também pode precisar definir um arquivo pid

pytivo_pidfile="/path/to/your/pidfile"
arqueado
fonte
Eu esperava que isso ajudasse, mas não ajuda. Ainda recebo : /usr/sbin/daemon: unexpected operatore meu script rc ainda não sabe se o script está realmente em execução.
21712 Josh
você pode tentar invocar o script com -x para ver qual comando falha
arqueado em 12/12/12