我正在尝试让 Unicorn 服务器在服务器启动时启动。我创建了一个 shell 脚本,如果我以 ubuntu 用户身份登录并运行,该脚本就会运行
/etc/init.d/unicorn start
Shell 脚本
#!/bin/sh
case "$1" in
start)
cd /home/ubuntu/projects/asbest/current/
unicorn_rails -c /home/ubuntu/projects/asbest/current/config/unicorn.rb -D -E production
;;
stop)
if ps aux | awk '{print $2 }' | grep `cat ~/projects/asbest/current/tmp/pids/unicorn.pid`> /dev/null; then kill `cat ~/projects/asbest/current/tmp/pids/uni$
;;
restart)
$0 stop
$0 start
;;
esac
当我重新启动服务器时,我注意到 unicorn 服务器没有监听套接字。由于我以 ubuntu 用户身份成功运行了代码,因此我修改了脚本,使其始终通过 sudo 使用 ubuntu 用户。
#!/bin/sh
case "$1" in
start)
cd /home/ubuntu/projects/asbest/current/
sudo -u ubuntu unicorn_rails -c /home/ubuntu/projects/asbest/current/config/unicorn.rb -D -E production
;;
stop)
if ps aux | awk '{print $2 }' | grep `cat ~/projects/asbest/current/tmp/pids/unicorn.pid`> /dev/null; then sudo -u ubuntu kill `cat ~/projects/asbest/current/tmp/pids/uni$
;;
restart)
$0 stop
$0 start
;;
esac
重启后,unicorn 仍然无法启动,所以我尝试从命令行运行脚本。现在我收到以下错误
sudo: unicorn_rails: command not found
我到处寻找导致这种情况的原因,但恐怕我已经用尽了我对 Linux 的有限理解。据我所知,虽然 sudo 应该使用 ubuntu 用户来执行命令,但它仍然使用 root 用户的环境,而该环境未配置为运行 ruby 或 unicorn。有人有这方面的经验吗?
答案1
使用全局变量UNICORN_*
如下:
UNICORN_HOME=/the/path
UNICORN_RAIL=${UNICORN_HOME}/unicorn_rail
UNICORN_CONFIG=${UNICORN_HOME}/config/unicorn.rb
UNICORN_PID=${UNICORN_HOME}/tmp/pids/unicorn.pid
UNICORN_USER=ubuntu
sudo -u ${UNICORN_USER} ${UNICORN_RAIL} -c $UNICORN_CONFIG -D -E production
另一个好方法是提取全局变量/etc/default/unicorn
:
UNICORN_HOME=/the/path
UNICORN_RAIL=${UNICORN_HOME}/unicorn_rail
UNICORN_CONFIG=${UNICORN_HOME}/config/unicorn.rb
UNICORN_PID=${UNICORN_HOME}/tmp/pids/unicorn.pid
UNICORN_USER=ubuntu
并在您的初始化脚本中添加更改所有变量:
if [ -f /etc/default/unicorn ]; then
. /etc/default/unicorn
fi
答案2
不要使用 ,而是sudo
尝试使用su [username]
,然后执行命令。
答案3
您需要指定路径unicorn_rails
:
UNICORN_HOME=/home/ubuntu/projects/asbest/current
cd $UNICORN_HOME
sudo -u ubuntu $UNICORN_HOME/unicorn_rails -c $UNICORN_HOME/config/unicorn.rb -D -E production
您是否已正确配置 sudo?