【问题标题】:FreeBSD rc script with output to file带有输出到文件的 FreeBSD rc 脚本
【发布时间】:2015-03-04 00:16:50
【问题描述】:

我在下面有这个脚本,我在其中启动了一个 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"

【问题讨论】:

  • 感谢所有帮助。但是我决定将日志记录直接写入 python 程序。所以它会写入日志文件。谢谢。

标签: python freebsd rc.d


【解决方案1】:

> 管道是 shell 的一个特性,而不是命令行的实际部分。当以编程方式涉及命令时,给定它们的参数不能包含 shell 指令(除非父进程对 shell 有特殊支持,例如 Python subprocess.Popen(shell=True) (doc)。

在这种情况下,您可以将命令 (/rpiVent/rpiVentService) 包装到一个 shell 脚本中,然后在 FreeBSD rc 脚本中调用这个 shell 脚本::

创建/rpiVent/run.sh:

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

然后使用 command(不需要 args)。

【讨论】:

  • 问题几乎相同,因为在执行上述解决方案时,启动命令永远不存在(执行 /etc/rc.d/rpiVent start),只需在 Shell 处等待,直到我终止任务。程序应该在后台运行但输出到日志文件?如果将 & 添加到 sh 脚本的末尾,它将启动该进程,但不会使用 /etc/rc.d/rpiVent stop 终止它
  • 如果你想无头启动程序(这样即使shell脚本终止它也能运行)你可以使用nohup UNIX命令将进程与正在运行的终端分离:man.cx/nohup跨度>
  • 我只想让我的程序作为服务工作。通过 /etc/rc.d/program start/stop 启动/停止。同时将标准输出/标准错误输出到日志文件。这在当时没有一起工作。如果我确实制作了一个可以启动和停止的 rc 脚本。像上面那个我不能得到任何输出到文件。如果我让它工作来制作一个日志文件,它会破坏启动/停止服务。 primary 停止,将无法控制使用的 pid。因为 pid 与 sh 脚本相关联,而不是与它自身的程序/python 相关联。
  • 使用守护进程也是如此。但仍然唯一的选择是 -f 将 stdout/stderr 发送到 /dev/null
  • 我认为您可以使用 UNIX tee 命令同时拥有 stdout/stderr 和日志文件。 tee 将 stdout/stderr 复制到日志文件。脚本也应该像这样工作:如果你的脚本运行一个子进程(python)并且脚本被杀死,那么 python 进程也会死亡。
【解决方案2】:

执行此操作的正确方法可能是使用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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 2017-09-14
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多