Centos
chkconfig 啟動腳本失敗,腳本手動執行良好
我最近購買了一個 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
然後,您可以查看日誌文件並查看哪個命令失敗。