요약 : init.d 시작 스크립트에서 명명 된 파이프를 사용하여 도움말을 찾고 있습니다. 파이프가 시작될 때 파이프가 작동하지 않아 파이프를 죽이는 방법을 알 수 없습니다.이 init.d 시작 스크립트에서 FIFO를 사용하는 방법을 알아 내려고 애 쓰고 있습니다.
저는 Ubuntu 10.04 x64에서 minecraft 서버를 시작하는 데 사용하는이 시작 스크립트가 있습니다. 한 가지 필요한 것은 쉘에서 서버로 명령을 전달할 수 있도록 읽기 FIFO를 설정하는 것입니다. 나는 .fifo 파일을 만들어 다음과 같이 내가 쉘에서 수동으로 서버를 실행하는 경우 그것은 잘 작동 : 나는 사투를 벌인거야
tail -f minecraft.fifo | /usr/lib/jvm/java-6-sun/bin/java -Xmx2048M -Xms2048M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar minecraft_server.jar &
는 내가 연결하면 그 init 스크립트에 꼬리 -f minecraft.fifo . 서비스를 시작하면 "tail -f minecraft.fifo"가 시작됩니다. 하지만 쉘에서 수동으로 시작할 때처럼 명령을 내 크래프트 서버에 전달하지 않습니다.
또한 명명 된 파이프를 중지하는 방법을 알지 못합니다. 지금까지 나는 프로세스의 PID를 저장 한 다음 중지하는 동안 해당 PID를 종료해야한다고 생각했습니다. 하지만 PID를 $에서 꺼내는 방법을 알지 못합니다! 내가 그것을 기억할 수 있도록 변수에 추가하십시오.
의미가 있습니까? 꼬리는 내가 그것을 호출 할 때 작동하지 않으며 꼬리 과정을 죽이는 방법을 알아 내지 못합니다. 여기
는 명명 된 파이프 포함되지 않은 기능 시작 스크립트입니다 : 그래서, 스크립트를 시작 않는 한 나는 DAEMON 변수를 수정하는 경우#!/bin/bash
# /etc/init.d/minecraft
### BEGIN INIT INFO
# Provides: minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Minecraft server
# Description: Starts the minecraft server
### END INIT INFO
#Settings
JARFILE='minecraft_server.jar'
USERNAME="minecraft"
MCHOME='/home/minecraft'
NAMEDPIPE='minecraft.fifo'
DAEMON="/usr/lib/jvm/java-6-sun/bin/java -Xmx2048M -Xms2048M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar $JARFILE nogui $"
ME=`whoami`
as_user() {
if [ $ME == $USERNAME ] ; then
bash -c "$1"
else
su - $USERNAME -c "$1"
fi
}
mc_start() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $JARFILE > /dev/null
then
echo "Tried to start but $JARFILE was already running!"
else
echo "$JARFILE was not running... starting."
cd $MCHOME
as_user "cd $MCHOME && screen -dmS minecraft $DAEMON"
sleep 7
if ps ax | grep -v grep | grep -v -i SCREEN | grep $JARFILE > /dev/null
then
echo "$JARFILE is now running."
else
echo "Could not start $JARFILE."
fi
fi
}
mc_stop() {
if ps ax | grep -v grep | grep -v -i SCREEN | grep $JARFILE > /dev/null
then
echo "$JARFILE is running... stopping."
as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'"
as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
sleep 10
as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'"
sleep 7
else
echo "$JARFILE was not running."
fi
if ps ax | grep -v grep | grep -v -i SCREEN | grep $JARFILE > /dev/null
then
echo "$JARFILE could not be shut down... still running."
else
echo "$JARFILE is shut down."
fi
}
#Start-Stop here
case "$1" in
start)
mc_start
;;
stop)
mc_stop
;;
restart)
mc_stop
mc_start
;;
status)
if ps ax | grep -v grep | grep -v -i SCREEN | grep $JARFILE > /dev/null
then
echo "$JARFILE is running."
else
echo "$JARFILE is not running."
fi
;;
*)
echo "Usage: /etc/init.d/minecraft {start|stop|status|restart}"
exit 1
;;
esac
exit 0
을, 꼬리는 -f는 찾을 수 있습니다 ps -ef :
DAEMON="tail -f minecraft.fifo | /usr/lib/jvm/java-6-sun/bin/java -Xmx2048M -Xms2048M -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar $JARFILE nogui $"
그러나 minecraft.fifo에 명령을 반향하면 서버에서 읽지 않습니다. ps를 보면 tail -f minecraft.fifo가 실제로 별도의 프로세스에서 시작하는 것처럼 보입니다. 그것은 문제 일 수 있습니다.
참고 : DAEMON을 호출하려면 SCREEN 명령을 사용하고 있습니다. 실행중인 서버로 이동하여 명령을 실행해야하기 때문입니다. 그래서 나는 사용자 minecraft로서 screen -r을 실행 한 다음 서버로 작업 할 수 있습니다. 그러나이 FIFO가 작동하면 더 이상 화면이 필요하지 않습니다. 그렇게되면 방해받을 수 있습니다.
죽이는 방법; mc_stop에 killall tail을 넣으면 작동합니다. 그러나 그것은 모든 꼬리를 죽이고 나는 죽이기를 원하지 않는 달리기를합니다. 지금까지 PID를 저장하는 방식으로 서버를 시작하는 방법을 알아 내지 못 했으므로 PID를 사용하지 못하게 할 수 있습니다. 또는 고유 한 프로세스 이름으로 꼬리를 시작하여 다른 꼬리를 위험에 빠뜨리지 않고 죽일 수 있습니다.
명명 된 파이프를 사용하여 서버를 올바르게 시작하는 방법에 대한 생각; 어떻게 제대로 멈출 수 있을까요?
사용자 응답을 '귀하의 문제에 대한 대답'으로 '수락'할 수 있으며 작성자에게 15 점을 부여합니다. 원하는 답변의 왼쪽 상단에있는 아래쪽 화살표 근처에있는 체크 표시 (예 : http://i.imgur.com/uqJeW.png)를 누르기 만하면됩니다. 행운을 빕니다! – shellter