【问题标题】:BASH: Shell Script as Init ScriptBASH:Shell 脚本作为初始化脚本
【发布时间】:2011-10-01 14:04:37
【问题描述】:

我有一个调用 java jar 文件并运行应用程序的 shell 脚本。没有办法解决这个问题,所以我必须使用我所拥有的。

当你执行这个 shell 脚本时,它会输出应用程序的状态,然后就坐在那里(几乎是一个控制台);因此,当程序发生问题时,它会更新屏幕。这就像任何正常的非守护进程/后台进程一样。摆脱它的唯一方法是 ctrl-c,然后完全结束该过程。我知道我可以通过 path_to_shell_script/script.sh & 来解决这个问题,这将为我的会话提供背景(如果我想注销,我可以使用 nohup)。

我的问题是,我只是不知道如何将此脚本放入初始化脚本中。我已经编写了大部分初始化脚本,但是当我尝试对其进行守护时,它不起作用。我几乎让它工作了,但是,当我运行 initscript 时,它实际上跨越了脚本上的同一个“控制台”,并且一直坐在那里,直到我按下 ctrl-c。这是有问题的行:

daemon ${basedir}/$prog && success || failure

问题是我不能只处理 daemon ${basedir}/$prog 部分的背景,我认为这就是我遇到问题的地方。有没有人成功地为 shell 脚本创建了一个 init 脚本?此外,此 shell 脚本不可守护(您可以将其作为后台,但底层程序不支持守护程序选项,否则我只会让应用程序完成所有工作)。

【问题讨论】:

    标签: bash shell daemon init


    【解决方案1】:

    我已经成功地使用了最初分离的屏幕会话来运行诸如半衰期服务器和我的自定义“尾日志文件”bash 脚本之类的东西。

    在后台启动一些东西:

    screen -dmS arbitarySessionName /path/to/script/launchService.sh
    

    查看流程:

    # screen -r arbitrarySessionName
    

    希望你觉得这很有用,gl!

    【讨论】:

      【解决方案2】:

      你需要打开一个子shell来执行它。它还有助于将其输出重定向到一个文件,或者至少是 /dev/null。

      类似:

      #!/bin/bash
      ( 
        { daemon ${basedir}/$prog && success || failure ; } &>/dev/null
      ) &
      exit 0
      

      它的工作方式如下(列表)&在后台子shell中。 { list } 是一个组命令,在这里用于捕获命令的所有输出并将其发送到 /dev/null。

      【讨论】: