【问题标题】:Self-daemonizing bash script自我守护的 bash 脚本
【发布时间】:2013-09-28 01:41:36
【问题描述】:

我想让脚本自我守护,即不需要在shell提示符下手动调用nohup $SCRIPT &>/dev/null &

我的计划是创建一段代码,如下所示:

#!/bin/bash
SCRIPTNAME="$0"

...

# Preps are done above
if [[ "$1" != "--daemonize" ]]; then
    nohup "$SCRIPTNAME" --daemonize "${PARAMS[@]}" &>/dev/null &
    exit $?
fi

# Rest of the code are the actual procedures of the daemon

这是明智的吗?你有更好的选择吗?

【问题讨论】:

  • 您至少应该在$SCRIPTNAME$1 周围使用双引号;否则,如果这些值中有空格,您会遇到麻烦。
  • @Alfe 你是对的。我忘记了双引号。感谢您指出这一点!

标签: bash daemon


【解决方案1】:

这是我看到的东西。

if [[ $1 != "--daemonize" ]]; then  

不应该是== --daemonize?

nohup $SCRIPTNAME --daemonize "${PARAMS[@]}" &>/dev/null &

您可以调用一个放置在后台的子shell,而不是再次调用您的脚本:

(
    Codes that run in daemon mode.
) </dev/null >/dev/null 2>&1 &
disown

或者

function daemon_mode {
    Codes that run in daemon mode.
}

daemon_mode </dev/null >/dev/null 2>&1 &
disown

【讨论】:

  • 上一个版本不需要括号。由于 &,函数将在新的子 shell 中运行。
  • 哦,是的。我刚刚添加了function 功能,所以我没有注意到它。谢谢。
  • 啊,谢谢!是的,这看起来更优雅。 [[ "$1" != --daemonize ]] 是正确的。基本上,如果没有使用--daemonize 参数调用脚本,它将通过--daemonize 参数重新启动自身。但是,我可以看到您的解决方案更加优雅,因此测试没有实际意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 2013-10-14
  • 2014-09-05
  • 2018-02-15
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多