Prozess aus eigenem Init script wird gekillt

G

Gast123

Hallo Leute,

mein nächstes Problem nach meinem Umsieg auf Fedora 15 macht sich bemerkbar.
Ich habe zwei eigene Init scripts vom vorherigen System übernommen (Fedora 14 lief ja noch mit dem alten Init-System):
1) Start script für meinen TS3 Server:
Code:
/etc/init.d/ts3d
Code:
#!/bin/bash
#
# ts3server    Startup script for the TeamSpeak 3 Server
#
# chkconfig: - 95 15
# description: The TeamSpeak 3 Server is an efficient and extensible  \
#	       server for voip communications.

TS_USER=teamspeak
TS_HOME=/home/teamspeak

cd $TS_HOME

if [ $EUID -eq 0 ]; then
	su $TS_USER -c "./ts3server_startscript.sh $@" -s /bin/bash
	exit $?
else
	echo 1>&2 "Insufficient permissions!"
fi

1) Start script für meinen Minecraft Server:
Code:
/etc/init.d/mined
Code:
#! /bin/bash
# chkconfig: - 99 01
# description: Minecraft server

#
# User definition
#
MC_USER=minecraft

#
# Absolute Paths
#
MC_HOME=/home/$MC_USER
MC_BACKUP=$MC_HOME/backup
MC_SERVERS=$MC_HOME/servers
ALL_SERVERS="`ls $MC_SERVERS | grep -v ".pid"`"

#
# Realative Paths
#
JAVA="java"
MC_EXEC="-jar minecraft_server.jar nogui"
MC_CONFIG=server.properties

#
# Private functions
#
chkcfg() {
	SERVERS=$@
	PORTS=
	XMS=0
	XMX=0
	for SERVER in $SERVERS; do
		cd $MC_SERVERS/$SERVER

		TMP_PORT=`grep server-port $MC_CONFIG | cut -d "=" -f 2`
		PORTS="$PORTS $TMP_PORT"
		
		TMP_XMS=`grep "xms=" $MC_CONFIG | cut -d "=" -f 2`
		XMS=$(($XMS+$TMP_XMS))
		TMP_XMX=`grep "xmx=" $MC_CONFIG | cut -d "=" -f 2`
		XMX=$(($XMX+$TMP_XMX))
	done

	echo -en "Checking configuration of servers\t"

	for PORT1 in $PORTS; do
		MATCH=0
		for PORT2 in $PORTS; do
			if [ "$PORT1" == "$PORT2" ]; then
				MATCH=$(($MATCH + 1))
			fi
		done
		if [ $MATCH -gt 1 ]; then
			echo "[ ERROR ]"
			echo -e "\t-> Some servers are using the same port. Fix this!"
			exit $(($MATCH -1))
		fi
	done
	
	MEM_AVAIL=$(($(free -m | grep Mem | cut -c 37-40)+$(free -m | grep Swap | cut -c 37-40)))
	if [ $XMS -gt $MEM_AVAIL ]; then
		echo "[ ERROR ]"
		echo -e "\t-> Servers require more minimum RAM in total than I have free!"
		echo -e "\t   ($XMS / $MEM_AVAIL)"
		exit 2
	fi

	MEM_TOTAL=$(($(free -m | grep Mem | cut -c 15-18)+$(free -m | grep Swap | cut -c 15-18)))
	if [ $XMX -gt $MEM_TOTAL ]; then
		echo "[ ERROR ]"
		echo -e "\t-> Servers require more maximum RAM in total than I can provide!"
		echo -e "\t   ($XMX / $MEM_TOTAL)"
		exit 2
	fi
	
	echo "[ OK ]"

	echo -e "\tXms total: $XMS\n\tXmx total: $XMX\n\tPorts: $PORTS"
	return 0
}

status_server() {
	if [ $# -ge 1 ]; then
		SERVER=$1
		QUIET=
		if [ "$2" == "quiet" ]; then
			QUIET=yes
		fi
		
		test $QUIET || echo -en "Status of Minecraft Server \"$SERVER\":\t"
	
		if [ -d $MC_SERVERS/$SERVER ]; then
			cd $MC_SERVERS/$SERVER
		else
			test $QUIET || echo "[ FAILED ]"
			test $QUIET || echo -e "\t\t -> no such server!"
			return 3
		fi

		if [ -f $MC_SERVERS/$SERVER.pid ]; then
			PID=`cat $MC_SERVERS/$SERVER.pid`
			PORT=`grep server-port $MC_CONFIG | cut -d "=" -f 2`
			PS=$(($(ps -p $PID | wc -l) - 1))

			if [ $PS -eq 1 ]; then
				test $QUIET || echo "[ RUNNING ]"
				test $QUIET || echo -e "\t PID: $PID \tPort: $PORT"
				return 0
			else
				test $QUIET || echo "[ DIED ]"
				rm $MC_SERVERS/$SERVER.pid
				return 2
			fi
		else
			test $QUIET || echo "[ DOWN ]"
			return 1
		fi
	else
		echo "Usage: status_server(SERVER{,quiet})"
		return 4
	fi
}

start_server() {
	if [ $# -eq 1 ]; then
		SERVER=$1

		echo -en "Starting Minecraft Server \"$SERVER\"\t"

		if ( ! status_server $SERVER quiet ); then
			if [ -d $MC_SERVERS/$SERVER ]; then
				cd $MC_SERVERS/$SERVER
			else
				echo "[ FAILED ]"
				echo -e "\t\t -> no such server!"
				return 1
			fi
			
			XMS=`grep xms= $MC_CONFIG | cut -d "=" -f 2`
			XMX=`grep xmx= $MC_CONFIG | cut -d "=" -f 2`	
			if [ -z "$XMS" -o -z "$XMX" ]; then
				echo "[ FAILED ]"
				echo -e "\t-> No Xms or Xmx set!"
				exit 2
			fi
			$JAVA -Xms"$XMS"M -Xmx"$XMX"M $MC_EXEC >> server.log 2>> server-err.log & echo $! > $MC_SERVERS/$SERVER.pid
			sleep 2

			if ( status_server $SERVER quiet ); then
				echo "[ DONE ]"
				return 0
			else
				echo "[ FAILED ]"
				return 1
			fi
		else
			echo "[ DONE ]"
			echo -e "\t\t-> already running!"
			return 0
		fi
	else
		echo "Usage: start_server(SERVER)"
		return 1
	fi
}

stop_server() {
	if [ $# -eq 1 ]; then
		SERVER=$1

		echo -en "Stopping Minecraft Server \"$SERVER\"\t"

		if ( status_server $SERVER quiet ); then
			if [ -d $MC_SERVERS/$SERVER ]; then
				cd $MC_SERVERS/$SERVER
			else
				echo "[ FAILED ]"
				echo -e "\t\t -> no such server!"
				return 1
			fi
			kill `cat $MC_SERVERS/$SERVER.pid 2> /dev/null` 2> /dev/null
			sleep 1

			while ( status_server $SERVER quiet ); do
				sleep 1
			done

			if ( ! status_server $SERVER quiet ); then
				rm $MC_SERVERS/$SERVER.pid 2> /dev/null
				echo "[ DONE ]"
				return 0
			fi
		else
			echo "[ DONE ]"
			echo -e "\t\t-> not running!"
			return 0
		fi	
	else
		echo "Usage: stop_server(SERVER)"
		return 1
	fi	
}

backup_server() {
	if [ $# -eq 1 -o $# -eq 2 ]; then
		SERVER=$1
		
		echo -en "Attempting to create backup of \"$SERVER\"\t"

		if [ -d $MC_SERVERS/$SERVER ]; then
			cd $MC_SERVERS/$SERVER
		else
			echo "[ FAILED ]"
			echo -e "\t\t -> no such server!"
			return 1
		fi

		cd $MC_SERVERS

		if [ ! -d $MC_BACKUP ]; then
			mkdir $MC_BACKUP
		fi
	
		TIME_STAMP=`date +%d.%m.%Y-%H.%M`
		BACKUP_FILE="$MC_BACKUP/minecraftbackup#$SERVER#$TIME_STAMP.tar.gz"

		tar -czf "$BACKUP_FILE" $SERVER > /dev/null 2> /dev/null
		
		if [ $? -eq 0 ]; then
			echo "[ DONE ]"
			return 0
		else
			echo "[ FAILED ]"
			rm $BACKUP_FILE 2> /dev/null
			return 1
		fi
	else
		echo "Usage: backup_server(SERVER{,TAG})"
		return 1
	fi	
}

#
# Public functions
#
start() {
	SERVERS="$@"
	if [ -z "$SERVERS" ]; then
		SERVERS=$ALL_SERVERS
	fi

	chkcfg $SERVERS

	RETVAL=0
	for SERVER in $SERVERS; do	
		start_server $SERVER
		RETVAL=$(($RETVAL + $?))
	done

	return $RETVAL
}

stop() {
	SERVERS="$@"
	if [ -z "$SERVERS" ]; then
		SERVERS=$ALL_SERVERS
	fi

	RETVAL=0
	for SERVER in $SERVERS; do	
		stop_server $SERVER
		RETVAL=$(($RETVAL + $?))
	done

	return $RETVAL
}

status() {
	SERVERS="$@"
	if [ -z "$SERVERS" ]; then
		SERVERS=$ALL_SERVERS
	fi

	RETVAL=0
	for SERVER in $SERVERS; do	
		status_server $SERVER
		RETVAL=$(($RETVAL + $?))
	done

	return $RETVAL
}

restart() {
	stop $@
	start $@
}

backup() {
	SERVERS="$@"
	if [ -z "$SERVERS" ]; then
		SERVERS=$ALL_SERVERS
	fi

	RETVAL=0
	for SERVER in $SERVERS; do
		SERVER_STATUS=`status_server $SERVER quiet; echo $?`
		if [ $SERVER_STATUS -eq 0 ]; then
			stop_server $SERVER
		fi
		
		backup_server $SERVER

		if [ $SERVER_STATUS -eq 0 ]; then
			start_server $SERVER
		fi
	done

	return $RETVAL
}

restore() {
	echo -en "Attempting to restore backup...\t\t"

	PATTERN=$1
	CNT=`ls -l $MC_BACKUP | grep "$PATTERN" | wc -l`

	if [ $CNT -eq 1 ]; then
		BACKUP=`ls $MC_BACKUP | grep "$PATTERN"`
		SERVER=`echo $BACKUP | cut -d "#" -f 2`

		if [ ! -d $MC_SERVERS/$SERVER ]; then
			echo "[ ERROR ]"
			echo -e "\t-> No such server \"$SERVER\"!"
			return 1
		fi
	
		SERVER_STATE=`status_server $SERVER quiet 2> /dev/null; echo $?`
		cd $MC_SERVERS
		
		if [ $SERVER_STATE -eq 0 ]; then
			stop_server $SERVER
		fi

		rm -R $SERVER
		tar -xzf $MC_BACKUP/$BACKUP > /dev/null 2> /dev/null
		RETVAL=$?

		if [ $SERVER_STATE -eq 0 ]; then
			start_server $SERVER
		fi
		
		if [ $RETVAL -eq 0 ]; then
			echo "[ DONE ]"
			return 0
		else
			echo "[ FAILED ]"
			return 1
		fi
	else
		echo "[ FAILED ]"
		echo -e "\t\t-> ambiguous selection"
		echo -e "\t\t   ($BACKUP)"
		return 2	
	fi
}

#
# Script begin
#
if [ "$USER" != "$MC_USER" -a "$1" != "status" ]; then
	su $MC_USER -c "$0 $*" -s /bin/bash
	exit $?
fi

cd $MC_HOME

CMD=$1
shift 

case $CMD in
	start)		start $@
	;;
	stop)		stop $@
	;;
	restart)	restart $@
	;;
	status)		status $@
	;;
	backup)		backup $@
	;;
	restore)	restore $@
	;;
	*)		echo "Usage: `basename $0` {start,stop,status,restart,backup,restore}"
esac

exit $?

Diese habe ich via
Code:
sudo chkconfig {ts3d,mined} on
aktiviert.
Offensichtlich werden die scripte auch beim booten gestartet, die Prozesse dann aber wieder gekillt, da beide Scripte einen entsprechenden Rückgabewert liefern.
Hat jemand eine Idee, woran das liegen kann und welche logfiles hilfreich wären?

Danke euch und LG

Schard
 
Hi

In welchen Runlevel hast du die Scripts verlinkt? (chkconfig --list)

In welchen Runlevel startest du per Default?

MFG
 
Hi,

Code:
mined           0:Aus   1:Aus   2:Ein   3:Ein   4:Ein   5:Ein   6:Aus
ts3d            0:Aus   1:Aus   2:Ein   3:Ein   4:Ein   5:Ein   6:Aus

Stanndard Runlevel ist multiuser (ohne GUI) (ehem. 3):
Code:
[schard@hpsrv system]$ ls -alF /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37  6. Jun 12:36 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
 
Hmm...

Eigentlich sollte das neue Upstart zu SysV kompatibel sein.

Fällt mir jetzt gerade nichts dazu ein was erklären könnte warum dein Script startet und gleich wieder gekillt wird.
 
Ja, die SysVInit Kompatiblilität scheint ihre Grenzen zu haben.
Habe nun systemd Skripte für die services geschrieben, die auch nun funktionieren:
Code:
[Unit]
Description=TeamSpeak 3 Server
After=NetworkManager.service

[Service]
Type=simple
User=teamspeak
ExecStart=/home/teamspeak/ts3server_minimal_runscript.sh
Restart=always

[Install]
WantedBy=multi-user.target
Code:
[Unit]
Description=Minecraft Server
After=NetworkManager.service

[Service]
Type=simple
User=minecraft
RemainAfterExit=yes
ExecStart=/home/minecraft/minecraft start
ExecStop=/home/minecraft/minecraft stop
Restart=on-failure

[Install]
WantedBy=multi-user.target
 

Ähnliche Themen

Switche abfragen über Script

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

Keine grafische Oberfläche (Debian Installation)

Zurück
Oben