我希望这只是因为我不理解 $PATH 变量的工作原理。我使用的是 Ubuntu 14.04。我正尝试通过 unicorn 服务器运行 rails。我的 unicorn 服务器的配置如下
# Change parameters below to appropriate values and set CONFIGURED to yes.
CONFIGURED=yes
# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60
# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
APP_ROOT=/home/rails/mydomain
# Server's config.rb, it's not a rack's config.ru
CONFIG_RB=/etc/unicorn.conf
# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
PID=/var/run/unicorn.pid
RAILS_ENV="production"
UNICORN_OPTS="-D -c $CONFIG_RB -E $RAILS_ENV"
export GEM_HOME=/home/rails/.gem
export GEM_PATH=$GEM_HOME/ruby/2.4.0
PATH=$GEM_HOME/bin:/usr/local/rvm/rubies/ruby-2.4.0/bin/:/usr/local/sbin:/usr/bin:/bin:/sbin:/usr/local/rvm/bin
which bundle
cd $APP_ROOT
DAEMON="bundle exec $GEM_PATH/bin/unicorn"
当我运行我的 unicorn 服务器时,出现此错误
myuser@mydomain:~$ sudo service unicorn restart
/home/rails/.gem/bin/bundle
* Restarting Unicorn web server unicorn
start-stop-daemon: unable to stat //bundle (No such file or directory)
为什么我刚刚在“which”语句中打印出“bundle(没有这样的文件或目录)”时,它却在抱怨?显然文件 bundle 存在。如果有用的话,我已将我的 /etc/init.d/unicorn 文件包含在下面。
#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: unicorn initscript
# Description: unicorn
### END INIT INFO
set -e
NAME=unicorn
DESC="Unicorn web server"
. /lib/lsb/init-functions
if [ -f /etc/default/unicorn ]; then
. /etc/default/unicorn
fi
PID=${PID-/run/unicorn.pid}
run_by_init() {
([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}
exit_with_message() {
if ! run_by_init; then
log_action_msg "$1 Not starting."
fi
exit 0
}
check_config() {
if [ $CONFIGURED != "yes" ]; then
exit_with_message "Unicorn is not configured (see /etc/default/unicorn)."
fi
}
check_app_root() {
if ! [ -d $APP_ROOT ]; then
exit_with_message "Application directory $APP_ROOT is not exist."
fi
}
set -u
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
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
stop)
log_daemon_msg "Stopping $DESC" $NAME || true
if start-stop-daemon --stop --signal QUIT --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
force-stop)
log_daemon_msg "Forcing stop of $DESC" $NAME || true
if start-stop-daemon --stop --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" $NAME || true
start-stop-daemon --stop --quiet --oknodo --pidfile $PID
sleep 1
if start-stop-daemon --start --quiet --oknodo --pidfile $PID --exec $DAEMON -- $UNICORN_OPTS; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
reload)
log_daemon_msg "Reloading $DESC" $NAME || true
if start-stop-daemon --stop --signal HUP --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
reopen-logs)
log_daemon_msg "Relopening log files of $DESC" $NAME || true
if start-stop-daemon --stop --signal USR1 --quiet --oknodo --pidfile $PID; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
;;
status)
status_of_proc -p $PID $DAEMON $NAME && exit 0 || exit $?
;;
*)
log_action_msg "Usage: $0 <start|stop|restart|force-reload|reload|force-stop|reopen-logs|status>" || true
exit 1
;;
esac
答案1
原因是传递给 start-stop-daemon 的执行路径必须是完全限定的。修复方法是设置
DAEMON="/path/to/bundle exec $GEM_PATH/bin/unicorn"
您可以使用这个简单的例子来测试一下
$ sudo start-stop-daemon --start --oknodo --user lathiat --pidfile /tmp/pid1 --exec sleep 60 --
[sudo] password for lathiat:
start-stop-daemon: unable to stat //sleep (No such file or directory)
$ sudo start-stop-daemon --start --oknodo --user lathiat --pidfile /tmp/pid1 --exec /bin/sleep 60 --