【问题标题】:init.d script won't start in reboot, but works from command lineinit.d 脚本不会在重新启动时启动,但可以从命令行运行
【发布时间】:2018-04-14 20:35:41
【问题描述】:

我知道这个问题已经被问过无数次了,但我就是想不通。我已经阅读了有关该主题的所有页面,但我尝试过的没有任何效果。

基本上,我在 /etc/init.d 中有一个脚本,它可以在命令行中正常工作,但在启动时不能正常工作。我不知道它是根本没有运行还是出现某种错误。

Robinson 是一个本土的 Sinatra 应用程序。

首先,这是 init.d 中的脚本:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          robinson
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: robinson initscript
# Description:       robinson
### END INIT INFO

# Do NOT "set -e"

DAEMON=/home/terry/projects/robinson/dev/trunk/installation/control.rb
SCRIPT_NAME=/etc/init.d/robinson
INSTALLATION_PATH="/home/terry/projects/robinson/dev/trunk/installation"


# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
    $DAEMON $INSTALLATION_PATH start
    ;;
  stop)
    $DAEMON $INSTALLATION_PATH stop
    ;;
  restart)
    $DAEMON $INSTALLATION_PATH restart
    ;;
  *)
    echo "Usage: $SCRIPT_NAME {start|stop|restart}" >&2
    exit 3
    ;;
esac


:

所以该脚本位于 /etc/init.d 中。它的权限设置如下:

init.d # ls -lh robinson 
-rwxr-xr-x 1 root root 839 Nov  2 03:45 robinson

我在脚本上运行了 update-rc.d。事实上,我什至尝试运行它来删除脚本,然后重新添加:

init.d # sudo update-rc.d robinson remove
init.d # sudo update-rc.d robinson defaults

如果我在命令行启动服务...

init.d # sudo service robinson start

...服务运行良好。

Sinatra 应用程序非常简单。现在我只是想让 Sinatra 工作。这是 config.ru 的全部内容:

require "rubygems"
require "sinatra"
require "sinatra/base"

# Robinson
class Robinson < Sinatra::Base
    get '/*' do
        return 'hello world'
    end
end

# run request routine
run Robinson

这是 Robinson 的 nginx 配置文件

# unicorn socket
upstream robinson_unicorn_server {
    server unix:/srv/terry/robinson/sockets/unicorn.sock
        fail_timeout=0;
}

unicorn.rb 看起来像这样:

# set path to app that will be used to configure unicorn
@dir = '/home/terry/projects/robinson/dev/trunk/installation/'

worker_processes 3
working_directory @dir
timeout 30

# configure for Robinson
robinson_data = '/srv/terry/robinson'

# Specify path to socket unicorn listens to,
# we will use this in our nginx.conf later
listen "#{robinson_data}/sockets/unicorn.sock", :backlog => 64

# Set process id path
pid "#{robinson_data}/pids/unicorn.pid"

# Set log file paths
stderr_path "#{robinson_data}/logs/unicorn.stderr.log"
stdout_path "#{robinson_data}/logs/unicorn.stdout.log"

值得注意的是,当我重新启动服务器时,unicorn.stderr.log 中没有添加任何条目。

这是一些系统信息:

Operating system: Ubuntu Linux 16.04.1
Kernel and CPU: Linux 4.4.0-98-generic on x86_64
nginx version: nginx/1.10.3 (Ubuntu)

不确定要提供哪些其他信息。如果有什么需要补充的,请告诉我。

感谢任何帮助。

【问题讨论】:

    标签: ubuntu nginx sinatra unicorn init.d


    【解决方案1】:

    我之前也遇到过类似的情况,这与运行脚本的“用户”有关,当您从命令行运行时,您正在使用 sudo 运行。

    我使用的一个可行的解决方案是设置一个变量,然后按以下方式执行脚本

    # set user to a user with permission to run the scripts (root is overkill)
    user=root
    case "$1" in
        start)
            sudo -u ${user} /home/script.sh ${1} >> /home/scriptlog.log
        ;;
    

    每个方法都一样

    可能对您的情况有所帮助

    【讨论】:

    • 我会对此进行试验,但现在我已经满意了。我编写了一个简单的脚本来检查服务器是否正在运行。如果不是,则脚本启动服务器。我将该脚本放入root 的crontab 中。这可能不是一种复杂的方法,但它很有效,我可以继续做其他事情。感谢您的帮助!
    猜你喜欢
    • 2019-02-08
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多