Centos

chkconfig 啟動腳本失敗,腳本手動執行良好

  • December 23, 2013

我最近購買了一個 vps,並嘗試創建一個啟動/重啟腳本來啟動我的 java 程序。我正在執行 CentOS 6。如果我使用以下命令手動執行該腳本,則該腳本可以工作:

服務策略伺服器啟動

但無法自動執行,在 /tmp/test.log 中創建一個文件,並出現以下錯誤:

啟動策略伺服器:失敗

這是裡面的啟動腳本/etc/init.d/

#!/bin/bash
#
#policyserver:          Startup script for CamSpark Policy Server Application.
#
#chkconfig: 3 80 05
#description:      Startup script for Cam Spark Policy Server Application.

CAMSPARK_POLICY_HOME=/tools/camsparkserver/Policy;
export CAMSPARK_POLICY_HOME

start() {
       echo -n "Starting Policy Server: "
       $CAMSPARK_POLICY_HOME/Policy.sh start >> /tmp/test.log
       sleep 2
       echo "done"
}

stop() {
       echo -n "Stopping Policy Server: "
       $CAMSPARK_POLICY_HOME/Policy.sh stop
       echo "done"
}

# See how we were called.
case "$1" in
       start)
               start
               ;;
       stop)
               stop
               ;;
       restart)
               stop
               start
               ;;
       *)
               echo $"Usage: policyserver {start|stop|restart}"
               exit
esac

這是主腳本(不能移動這個腳本)

#!/bin/bash
#
# chkconfig: 345 99 05 
# description: Java deamon script
#
# A non-SUSE Linux start/stop script for Java daemons.
#
# Set this to your Java installation
JAVA_HOME=/usr/java/latest

scriptFile=$(readlink -fn $(type -p $0))                   # the absolute, dereferenced path of this script file
scriptDir=$(dirname $scriptFile)                           # absolute path of the script directory
serviceNameLo="policyserver"                                  # service name with the first letter in lowercase
serviceName="PolicyServer"                                    # service name
serviceUser="root"                                      # OS user name for the service
serviceGroup="root"                                    # OS group name for the service
applDir="/tools/camsparkserver/Policy"                          # home directory of the service application
serviceUserHome="/home/$serviceUser"                       # home directory of the service user
serviceLogFile="/var/log/$serviceNameLo.log"               # log file for StdOut/StdErr
maxShutdownTime=15                                         # maximum number of seconds to wait for the daemon to terminate normally
pidFile="/var/run/$serviceNameLo.pid"                      # name of PID file (PID = process ID number)
javaCommand="java"                                         # name of the Java launcher without the path
javaExe="$javaCommand"                      # file name of the Java application launcher executable
javaArgs="PolicyServer"                     # arguments for Java launcher
javaCommandLine="$javaExe $javaArgs"                       # command line to start the Java service application
javaCommandLineKeyword="PolicyServer"                     # a keyword that occurs on the commandline, used to detect an already running service process and to distinguish it from others

# Makes the file $1 writable by the group $serviceGroup.
function makeFileWritable {
  local filename="$1"
  touch $filename || return 1
  chgrp $serviceGroup $filename || return 1
  chmod g+w $filename || return 1
  return 0; }

# Returns 0 if the process with PID $1 is running.
function checkProcessIsRunning {
  local pid="$1"
  if [ -z "$pid" -o "$pid" == " " ]; then return 1; fi
  if [ ! -e /proc/$pid ]; then return 1; fi
  return 0; }

# Returns 0 if the process with PID $1 is our Java service process.
function checkProcessIsOurService {
  local pid="$1"
  if [ "$(ps -p $pid --no-headers -o comm)" != "$javaCommand" ]; then return 1; fi
  grep -q --binary -F "$javaCommandLineKeyword" /proc/$pid/cmdline
  if [ $? -ne 0 ]; then return 1; fi
  return 0; }

# Returns 0 when the service is running and sets the variable $pid to the PID.
function getServicePID {
  if [ ! -f $pidFile ]; then return 1; fi
  pid="$(<$pidFile)"
  checkProcessIsRunning $pid || return 1
  checkProcessIsOurService $pid || return 1
  return 0; }

function startServiceProcess {
  cd $applDir || return 1
  rm -f $pidFile
  makeFileWritable $pidFile || return 1
  makeFileWritable $serviceLogFile || return 1
  cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile"
  # Don't forget to add -H so the HOME environment variable will be set correctly.
  sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1
  sleep 0.1
  pid="$(<$pidFile)"
  if checkProcessIsRunning $pid; then :; else
     echo -ne "\n$serviceName start failed, see logfile."
     return 1
  fi
  return 0; }

function stopServiceProcess {
  kill $pid || return 1
  for ((i=0; i<maxShutdownTime*10; i++)); do
     checkProcessIsRunning $pid
     if [ $? -ne 0 ]; then
        rm -f $pidFile
        return 0
        fi
     sleep 0.1
     done
  echo -e "\n$serviceName did not terminate within $maxShutdownTime seconds, sending SIGKILL..."
  kill -s KILL $pid || return 1
  local killWaitTime=15
  for ((i=0; i<killWaitTime*10; i++)); do
     checkProcessIsRunning $pid
     if [ $? -ne 0 ]; then
        rm -f $pidFile
        return 0
        fi
     sleep 0.1
     done
  echo "Error: $serviceName could not be stopped within $maxShutdownTime+$killWaitTime seconds!"
  return 1; }

function startService {
  getServicePID
  if [ $? -eq 0 ]; then echo -n "$serviceName is already running"; RETVAL=0; return 0; fi
  echo -n "Starting $serviceName   "
  startServiceProcess
  if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
  echo "started PID=$pid"
  RETVAL=0
  return 0; }

function stopService {
  getServicePID
  if [ $? -ne 0 ]; then echo -n "$serviceName is not running"; RETVAL=0; echo ""; return 0; fi
  echo -n "Stopping $serviceName   "
  stopServiceProcess
  if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
  echo "stopped PID=$pid"
  RETVAL=0
  return 0; }

function checkServiceStatus {
  echo -n "Checking for $serviceName:   "
  if getServicePID; then
   echo "running PID=$pid"
   RETVAL=0
  else
   echo "stopped"
   RETVAL=3
  fi
  return 0; }

function main {
  RETVAL=0
  case "$1" in
     start)                                               # starts the Java program as a Linux service
        startService
        ;;
     stop)                                                # stops the Java program service
        stopService
        ;;
     restart)                                             # stops and restarts the service
        stopService && startService
        ;;
     status)                                              # displays the service status
        checkServiceStatus
        ;;
     *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
     esac
  exit $RETVAL
}

main $1

有誰知道可能是什麼問題?

**編輯:**執行此處發布的答案之一。

這是我剛剛執行該命令時得到的結果

[root@camspark Policy]# service policyserver stop
Stopping Policy Server: Stopping PolicyServer   stopped PID=683
done
[root@camspark Policy]# bash -x service policyserver start |& tee policyserver_startup.log
+ . /etc/init.d/functions
++ TEXTDOMAIN=initscripts
++ umask 022
++ PATH=/sbin:/usr/sbin:/bin:/usr/bin
++ export PATH
++ '[' -z '' ']'
++ COLUMNS=80
++ '[' -z '' ']'
+++ /sbin/consoletype
++ CONSOLETYPE=pty
++ '[' -f /etc/sysconfig/i18n -a -z '' -a -z '' ']'
++ . /etc/profile.d/lang.sh
++ unset LANGSH_SOURCED
++ '[' -z '' ']'
++ '[' -f /etc/sysconfig/init ']'
++ . /etc/sysconfig/init
+++ BOOTUP=color
+++ RES_COL=60
+++ MOVE_TO_COL='echo -en \033[60G'
+++ SETCOLOR_SUCCESS='echo -en \033[0;32m'
+++ SETCOLOR_FAILURE='echo -en \033[0;31m'
+++ SETCOLOR_WARNING='echo -en \033[0;33m'
+++ SETCOLOR_NORMAL='echo -en \033[0;39m'
+++ PROMPT=no
+++ AUTOSWAP=no
+++ ACTIVE_CONSOLES='/dev/tty[1-6]'
+++ SINGLE=/sbin/sushell
++ '[' pty = serial ']'
++ __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
++ basename service
+ VERSION='service ver. 0.91'
++ basename service
+ USAGE='Usage: service < option > | --status-all | [ service_name [ command | --full-restart ] ]'
+ SERVICE=
+ SERVICEDIR=/etc/init.d
+ OPTIONS=
+ '[' 2 -eq 0 ']'
+ cd /
+ '[' 2 -gt 0 ']'
+ case "${1}" in
+ '[' -z '' -a 2 -eq 1 -a policyserver = --status-all ']'
+ '[' 2 -eq 2 -a start = --full-restart ']'
+ '[' -z '' ']'
+ SERVICE=policyserver
+ shift
+ '[' 1 -gt 0 ']'
+ case "${1}" in
+ '[' -z policyserver -a 1 -eq 1 -a start = --status-all ']'
+ '[' 1 -eq 2 -a '' = --full-restart ']'
+ '[' -z policyserver ']'
+ OPTIONS=' start'
+ shift
+ '[' 0 -gt 0 ']'
+ '[' -f /etc/init.d/policyserver ']'
+ env -i PATH=/sbin:/usr/sbin:/bin:/usr/bin TERM=xterm /etc/init.d/policyserver start
Starting Policy Server: done
[root@camspark Policy]#

這是該日誌文件中的內容

[root@camspark Policy]# head policyserver_startup.log
+ . /etc/init.d/functions
++ TEXTDOMAIN=initscripts
++ umask 022
++ PATH=/sbin:/usr/sbin:/bin:/usr/bin
++ export PATH
++ '[' -z '' ']'
++ COLUMNS=80
++ '[' -z '' ']'
+++ /sbin/consoletype
++ CONSOLETYPE=pty
[root@camspark Policy]#

您可以通過以更詳細的方式執行啟動腳本來調試此類問題。

$ bash -x service policyserver start

您可能還想將此輸出擷取到日誌文件中。

$ bash -x service policyserver start |& tee policyserver_startup.log

然後,您可以查看日誌文件並查看哪個命令失敗。

引用自:https://unix.stackexchange.com/questions/106283