Назад | Перейти на главную страницу

Сценарий FreeBSD rc.d не работает при запуске

Я пытаюсь написать сценарий rc.d для запуска fastcgi-mono-server4 на FreeBSD при запуске компьютера - чтобы запустить его с nginx.

Сценарий работает, когда я выполняю его при входе на сервер, но при загрузке я получаю следующее сообщение:

eval: -applications=192.168.50.133:/:/usr/local/www/nginx: not found

Скрипт выглядит следующим образом:

#!/bin/sh

# PROVIDE: monofcgid
# REQUIRE: LOGIN nginx
# KEYWORD: shutdown


. /etc/rc.subr

name="monofcgid"
rcvar="monofcgid_enable"
stop_cmd="${name}_stop"
start_cmd="${name}_start"
start_precmd="${name}_prestart"
start_postcmd="${name}_poststart"
stop_postcmd="${name}_poststop"
command=$(which fastcgi-mono-server4)
apps="192.168.50.133:/:/usr/local/www/nginx"
pidfile="/var/run/${name}.pid"

monofcgid_prestart()
{
        if [ -f $pidfile ]; then
                echo "monofcgid is already running."
                exit 0
        fi
}

monofcgid_start()
{
        echo "Starting monofcgid."
        ${command} -applications=${apps} -socket=tcp:127.0.0.1:9000 &
}


monofcgid_poststart()
{
        MONOSERVER_PID=$(ps ax | grep mono/4.0/fastcgi-m | grep -v grep | awk '{print $1}')
        if [ -f $pidfile ]; then
                rm $pidfile
        fi
        if [ -n $MONOSERVER_PID ]; then
                echo $MONOSERVER_PID > $pidfile
        fi
}

monofcgid_stop()
{
        if [ -f $pidfile ]; then
                echo "Stopping monofcgid."
                kill $(cat $pidfile)
                echo "Stopped monofcgid."
        else
                echo "monofcgid is not running."
                exit 0
        fi
}

monofcgid_poststop()
{
        rm $pidfile
}


load_rc_config $name
run_rc_command "$1"

В случае, если это еще не совсем понятно, я новичок в сценариях FreeBSD и sh, поэтому я вроде готов к некоторым очевидным мелочам, которые я упустил.

Я очень хотел бы знать, почему именно это не удается и как это решить, но также, если у кого-то есть лучший способ добиться этого, то я все открыт для идей.

Проблема, которую вы указали, возможно, связана с разницей в вашем ПУТИ, когда вы выполняете сценарий как зарегистрированный пользователь и когда сценарий выполняется при запуске.

Вывод "which" зависит от PATH. Поэтому, если место, где находится ваш исполняемый файл, не находится в PATH, он ничего не вернет.

Я бы посоветовал вам явно указать путь к исполняемому файлу в команде $. Или измените PATH поверх этого скрипта следующим образом:

PATH="${PATH}:/path/to/where/daemon/lies"

Использовать переменную rc command_args вместо apps. RC обрабатывает command_args определенным образом, экранируя в нем специальные символы для оценки.

Оказывается, настоящая проблема была в следующей строке:

command=$(which fastcgi-mono-server4)

Я предполагаю, что произошло то, что при запуске это привело к пустой строке, что означало, что «-applications ...» были оценены как команда.