运行守护程序时,如何从给定目录执行命令?

运行守护程序时,如何从给定目录执行命令?

我的 shell 脚本知识有点不稳定,但我想运行 /etc/init.d/unicorn 中定义的守护进程(Ubuntu 14.04),如下所示

case "$1" in
  start)
        check_config
        check_app_root

        log_daemon_msg "Starting $DESC" $NAME || true
        if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then

在单独的文件 /etc/default/unicorn 中,我定义了以下变量:

APP_ROOT=/home/rails/myproject
...
UNICORN_OPTS="-D -c $CONFIG_RB -E $RAILS_ENV"
...
DAEMON="cd $APP_ROOT; $GEM_HOME/bin/bundle exec $GEM_PATH/bin/unicorn"

我添加了“cd $APP_ROOT”,因为这是“$GEM_HOME/bin/bundle”必须运行的目录。但是,当我启动服务时,出现以下错误:

myuser@myproject:~$ sudo service unicorn restart
/home/rails/.gem/bin/bundle
 * Restarting Unicorn web server unicorn
start-stop-daemon: unable to stat //cd (No such file or directory)

是否有其他方法可以存储我的选项,以便我可以从所需的目录运行我的命令?

答案1

您所做的事情似乎存在一些问题。

  • --execstart-stop-daemon只接受一个参数,但是可以在a 的末尾传递参数--

  • 的参数--exec也用作标识符:start-stop-daemon检查是否有一个实例正在运行(这将使 成为/bin/sh一个非常糟糕的候选者。

因此,创建一个 shell 脚本,预计每台机器运行一个实例。将绝对路径传递给--exec.在--.

相关内容