Есть ли простой способ создать скрипт FreeBSD rc?

9

У меня есть тюрьма FreeBSD, в которой я запускаю сервер с помощью команды:

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

В данный момент мне приходится выполнять эту команду каждый раз, когда я перезагружаю машину и запускается джейл. Я хотел бы, чтобы эта команда началась с /etc/rc. Есть ли простой способ создать сценарий FreeBSD rc для daemonкоманды?


ОБНОВЛЕНИЕ: я прочитал эту документацию BSD о скриптах rc , и из этого я создал следующий скрипт /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"

Это работает , чтобы запустить сценарий питона Я желающих как демон при запуске тюрьмы ... (учитывая pytivo_enable="YES"в /etc/rc.conf) , но сценарий гс не знает , если запущен демон (он думает , что это не тогда , когда она есть) и выдает предупреждение, когда я пытаюсь его запустить:

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

Так что это близко , и это работает , но я чувствую, что смогу получить лучшую функциональность, чем эта.

мистифицировать
источник
Вам нужно поместить этот скрипт куда-нибудь (не помню сейчас) и поместить строку XX_enable="YES"в /etc/rc.conf, чтобы сделать его автоматическим запуском. Начните с поиска существующих сценариев
маргаритка
Я ищу простой способ создания сценария ... Есть ли хороший сценарий, который я могу скопировать и использовать повторно?
Джош

Ответы:

11

commandне должен содержать несколько слов. Это причина [ошибки, которую вы видите. Вы должны установить любые флаги отдельно.

Кроме того, вы должны использовать pytivo_userдля установки запуска UID, а не daemon -u. См. Справочную страницу rc.subr (8) для всех этих магических переменных.

Кроме того, вы должны сообщить подсистеме rc, что pytivo - это скрипт Python, чтобы он мог найти процесс, когда проверяет, работает ли он.

Наконец, вы должны использовать идиоматические set_rcvarдля rcvar.

Примерно так (я не уверен, что это правильный путь 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
источник
Проблема в том, что usr/local/pytivo/pyTivo.py не демонизируется , поэтому без вызова /usr/bin/daemonя просто запустил команду во время запуска/etc/rc.d/pytivo start
Josh
Однако это исправляет statusи stopкоманды!
Джош
О, сценарий не демонизируется? Я думаю, что самое простое решение - это установить start_cmdперед вызовом load_rc_config:start_cmd="/usr/sbin/daemon -u $pytivo_user $command"
aecolley
В этом было волшебство, необходимое для запуска моего сценария. Спасибо!
Дейв Марторана,
0

Если вам не нужен rc-скрипт, вы можете использовать просто /etc/rc.local.

Для вашего rc-скрипта вам не хватает зависимых комментариев, хотя бы строки

# REQUIRE: LOGIN

Должно помочь, что он запущен в нужное время.

Вам также может понадобиться определить pid-файл

pytivo_pidfile="/path/to/your/pidfile"
Arved
источник
Я надеялся, что это поможет, но это не так. Я все еще получаю, : /usr/sbin/daemon: unexpected operatorи мой сценарий rc все еще не знает, работает ли сценарий на самом деле.
Джош
Вы можете попытаться вызвать сценарий с помощью -x, чтобы увидеть, какая команда не выполнена
arved