2016-04-24 7 views
0

I 14 LTS jedoch logstash als Dienst unter Ubuntu installierte ich die folgende Fehlermeldung erhalten, wenn Sie den Dienst starten (sudo service logstash start):logstash Dienst kann nicht wegen Erlaubnis startet

{:timestamp=>"2016-04-24T13:10:15.260000+0700", :message=>"The error reported is: \n Permission denied - /opt/elk-stack/logstash-1.5.3/vendor/bundle/jruby/1.9/gems/addressable-2.3.8/data/unicode.data"} 

Hier ist die Erlaubnis auf den unicode.data Datei:

-rwxrwxrwx 1 tuan sudo 115740 Jul 21 2015 /opt/elk-stack/logstash-1.5.3/vendor/bundle/jruby/1.9/gems/addressable-2.3.8/data/unicode.data 

Beim Ausführen-Befehl:

sudo bin/logstash -f logstash.conf 

Es hat funktioniert!

Meine /etc/default/logstash Datei:

############################### 
# Default settings for logstash 
# /etc/default/logstash 
############################### 

# Override Java location 
JAVACMD=/usr/bin/java 

# Set a home directory 
LS_HOME=/opt/elk-stack/logstash-1.5.3/tmp 

# Arguments to pass to logstash agent 
LS_OPTS="" 
LS_HEAP_SIZE="500m" 
LS_JAVA_OPTS="-Djava.io.tmpdir=$HOME" 

# pidfiles aren't used for upstart; this is for sysv users. 
LS_PIDFILE=/var/run/logstash.pid 

# user id to be invoked as; for upstart: edit /etc/init/logstash.conf 
LS_USER=root 

# logstash logging 
LS_LOG_FILE=/var/log/logstash.log 
LS_USE_GC_LOGGING="true" 

# logstash configuration directory 
LS_CONF_DIR=/opt/elk-stack/logstash-1.5.3 

# Open file limit; cannot be overridden in upstart 
LS_OPEN_FILES=40 

# Nice level 
LS_NICE=19 

# If this is set to 1, then when `stop` is called, if the process has 
# not exited within a reasonable time, SIGKILL will be sent next. 
# The default behavior is to simply log a message "program stop failed; still running" 
KILL_ON_STOP_TIMEOUT=0 

Und hier ist das Init-Skript:

#!/bin/bash 
# 
# /etc/init.d/logstash -- startup script for LogStash. 
# 
### BEGIN INIT INFO 
# Provides:   logstash 
# Required-Start: $all 
# Required-Stop:  $all 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Starts logstash 
# Description:  Starts logstash using start-stop-daemon 
### END INIT INFO 

set -e 

NAME=logstash 
DESC="Logstash Daemon" 
DEFAULT=/etc/default/$NAME 

if [ `id -u` -ne 0 ]; then 
    echo "You need root privileges to run this script" 
    exit 1 
fi 

. /lib/lsb/init-functions 

if [ -r /etc/default/rcS ]; then 
    . /etc/default/rcS 
fi 

# The following variables can be overwritten in $DEFAULT 
PATH=/bin:/usr/bin:/sbin:/usr/sbin 

# overwrite settings from default file 
if [ -f "$DEFAULT" ]; then 
    . "$DEFAULT" 
fi 

# Define other required variables 
PID_FILE=${LS_PIDFILE} 
DAEMON=/opt/elk-stack/logstash-1.5.3/bin/logstash 
DAEMON_OPTS="agent -f ${LS_CONF_DIR}/${NAME}.conf -l ${LS_LOG_FILE} ${LS_OPTS}" 

# Check DAEMON exists 
if ! test -e $DAEMON; then 
    log_failure_msg "Script $DAEMON doesn't exist" 
    exit 1 
fi 

case "$1" in 
    start) 
     if [ -z "$DAEMON" ]; then 
     log_failure_msg "no logstash script found - $DAEMON" 
     exit 1 
     fi 

     # Check if a config file exists 
     if [ ! "$(ls -A $LS_CONF_DIR/*.conf 2> /dev/null)" ]; then 
     log_failure_msg "There aren't any configuration files in $LS_CONF_DIR" 
     exit 1 
     fi 

     log_daemon_msg "Starting $DESC" 

     # Parse the actual JAVACMD from the process' environment, we don't care about errors. 
     JAVA=$(cat /proc/$(cat "${PID_FILE}" 2>/dev/null)/environ 2>/dev/null | grep -z ^JAVACMD= | cut -d= -f2) 
     if start-stop-daemon --test --start --pidfile "$PID_FILE" \ 
     --user "$LS_USER" --exec "$JAVA" \ 
     >/dev/null; then 
     # Prepare environment 
     HOME="${HOME:-$LS_HOME}" 
     LS_JAVA_OPTS="${LS_JAVA_OPTS} -Djava.io.tmpdir=${LS_HOME}" 
     ulimit -n ${LS_OPEN_FILES} 
     cd "${LS_HOME}" 
     export PATH HOME JAVACMD LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING 

     # Start Daemon 
     start-stop-daemon --start -b --user "$LS_USER" -c "$LS_USER":"$LS_GROUP" \ 
      -d "$LS_HOME" --nicelevel "$LS_NICE" --pidfile "$PID_FILE" --make-pidfile \ 
      --exec $DAEMON -- $DAEMON_OPTS 

     sleep 1 

     # Parse the actual JAVACMD from the process' environment, we don't care about errors. 
     JAVA=$(cat /proc/$(cat "${PID_FILE}" 2>/dev/null)/environ 2>/dev/null | grep -z ^JAVACMD= | cut -d= -f2) 
     if start-stop-daemon --test --start --pidfile "$PID_FILE" \ 
      --user "$LS_USER" --exec "$JAVA" \ 
     >/dev/null; then 

      if [ -f "$PID_FILE" ]; then 
       rm -f "$PID_FILE" 
      fi 

      log_end_msg 1 
     else 
      log_end_msg 0 
     fi 
     else 
     log_progress_msg "(already running)" 
     log_end_msg 0 
     fi 
    ;; 
    stop) 
     log_daemon_msg "Stopping $DESC" 

     set +e 

     if [ -f "$PID_FILE" ]; then 
     start-stop-daemon --stop --pidfile "$PID_FILE" \ 
      --user "$LS_USER" \ 
      --retry=TERM/20/KILL/5 >/dev/null 

     if [ $? -eq 1 ]; then 
      log_progress_msg "$DESC is not running but pid file exists, cleaning up" 
     elif [ $? -eq 3 ]; then 
      PID="`cat $PID_FILE`" 
      log_failure_msg "Failed to stop $DESC (pid $PID)" 
      exit 1 
     fi 

     rm -f "$PID_FILE" 
     else 
     log_progress_msg "(not running)" 
     fi 

     log_end_msg 0 
     set -e 
    ;; 
    status) 
     set +e 

     # Parse the actual JAVACMD from the process' environment, we don't care about errors. 
     JAVA=$(cat /proc/$(cat "${PID_FILE}" 2>/dev/null)/environ 2>/dev/null | grep -z ^JAVACMD= | cut -d= -f2) 
     start-stop-daemon --test --start --pidfile "$PID_FILE" \ 
     --user "$LS_USER" --exec "$JAVA" \ 
     >/dev/null 2>&1 

     if [ "$?" = "0" ]; then 
     if [ -f "$PID_FILE" ]; then 
      log_success_msg "$DESC is not running, but pid file exists." 
      exit 1 
     else 
      log_success_msg "$DESC is not running." 
      exit 3 
     fi 
     else 
     log_success_msg "$DESC is running with pid `cat $PID_FILE`" 
     fi 

     set -e 
    ;; 
    restart|force-reload) 
     if [ -f "$PID_FILE" ]; then 
     $0 stop 
     sleep 1 
     fi 

     $0 start 
    ;; 
    *) 
     log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}" 
     exit 1 
    ;; 
esac 

exit 0 

Wer kann mir helfen Sie bitte?

+0

Überprüfen Sie die Berechtigungen für die Verzeichnisse auch ganz unten. 777 ist ein bisschen viel für diese Datei, ich wette. –

+0

@AlainCollins Ich habe bereits versucht, die Erlaubnis für alle Verzeichnisse, aber kein Glück zu setzen :( –

Antwort

0

Schließlich habe ich regelte es durch den Wert zu ändern:

LS_OPEN_FILES=40 

zu einem größeren. Und in meinem Fall ist es 400. Der Grund ist, dass das Init-Skript den Befehl ulimit ausführt und es scheint, dass 40 nicht groß genug für logstash ist!

0

Wenn Sie logstash über den Dienst ausführen, wird versucht, den logstash-Benutzer zu starten (normalerweise - abhängig davon, wie es installiert wurde und wie das init-Skript konfiguriert ist).

Ich würde überprüfen, um sicherzustellen, dass Sie einen logstash Benutzer:

id logstash 

Und Sie können auch den Init-Skript überprüfen:

less /etc/init.d/logstash 

Dann wie in der Datei nach der Zeile suchen:

LS_USER=logstash 

In meinem Beispiel des logstash Dienst versucht, als logstash Benutzer zu starten, wenn Ihr Benutzer na Ich zu LS_USER ist ein anderer Name, dann benutze diesen Namen stattdessen in der unten stehenden Liste.

Um dieses Problem zu beheben, würde ich changin Besitz aller Dateien empfehlen:

sudo chown -R logstash: /opt/elk-stack/logstash-1.5.3 

Dann versuchen Sie es erneut mit Service starten.

+0

Vielen Dank für die ausführliche Antwort. Aber es ist nicht der Fall. Ich habe bereits überprüft die Datei '/ etc/default/logstash' und sah das' LS_USER' ist als 'root' gesetzt! Wie auch immer, danke nochmal;) –

+0

Wenn es als root laufen würde, hättest du kein Berechtigungsproblem. Ich schlage vor, dass du die init Datei – Rumbles

+0

überprüfe. Ich habe diese Zeile' start-stop-daemon 'gesehen --start -b --user "$ LS_USER" -c "$ LS_USER": "$ LS_GROUP" ....'in meinem Init-Skript –