Скрипт FreeBSD rc с выводом в файл

У меня есть этот скрипт ниже, где я запускаю программу на Python.
Программа python выводит на стандартный вывод / терминал. Но я хочу, чтобы программа запускалась через скрипт rc без вывода сообщений.

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

Где моя проблема?

#!/bin/sh
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr

location="/rpiVent"

name="rpiVentService"
rcvar=`set_rcvar`
command="$location/$name"
#command_args="> $location/$name.log" // Removed
command_interpreter="/usr/bin/python"

load_rc_config $name
run_rc_command "$1"

2 ответа

Трубопровод с > это особенность оболочки, а не фактическая часть командной строки. Когда команды задействованы программно, переданные им аргументы не могут содержать директивы оболочки (если родительский процесс не имеет специальной поддержки оболочки, как в Python subprocess.Popen(shell=True) ( док).

Что в этом случае вы можете сделать, это то, что вы можете обернуть свою команду (/rpiVent/rpiVentService) к сценарию оболочки, затем вызовите этот сценарий оболочки в сценарии FreeBSD rc:

Creat /rpiVent/run.sh:

 #!/bin/sh
 /rpiVent/rpiVentservice > /rpiVent/rpiVentService.log 

а затем использовать это command (аргументы не нужны).

Правильный способ сделать это, вероятно, «переопределить» команду запуска, используя start_cmdпеременная, например:

      #!/bin/sh
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr

location="/rpiVent"

name="rpiVentService"
rcvar=`set_rcvar`

load_rc_config $name

command="$location/$name"
command_interpreter="/usr/bin/python"

start_cmd=rpivent_cmd

rpivent_cmd()
{
   $command_interpreter $command >$location/$name.log
}

run_rc_command "$1"
Другие вопросы по тегам