Fedora에서 pid를 사용하여 Java 프로세스의 .sh를 호출하는 방법

Fedora에서 pid를 사용하여 Java 프로세스의 .sh를 호출하는 방법

마인크래프트 서버를 시작하고 싶습니다. 그래서 .jar파일을 다운로드하고 Java 8을 설치하고 다음과 같은 사용자와 디렉토리를 만들었습니다.

ls -la
insgesamt 29552
drwxrwxr-x. 4 minecraft minecraft      235 26. Mär 19:32 .
drwx------. 3 minecraft minecraft       97 25. Mär 19:28 ..
-rw-rw-r--. 1 minecraft minecraft        2 26. Mär 21:16 banned-ips.json
-rw-rw-r--. 1 minecraft minecraft        2 26. Mär 21:16 banned-players.json
-rw-rw-r--. 1 minecraft minecraft      181 25. Mär 19:22 eula.txt
drwxrwxr-x. 2 minecraft minecraft     4096 26. Mär 21:16 logs
-rwxrwxr-x. 1 minecraft minecraft 30222121 18. Sep 2017  minecraft_server.jar
-rw-rw-r--. 1 minecraft minecraft        2 26. Mär 21:16 ops.json
-rw-rw-r--. 1 minecraft minecraft      754 26. Mär 21:16 server.properties
-rwxrwxr-x. 1 minecraft minecraft      141 26. Mär 21:08 startup-server.sh
-rw-rw-r--. 1 minecraft minecraft      214 26. Mär 21:17 usercache.json
-rw-rw-r--. 1 minecraft minecraft        2 25. Mär 19:23 whitelist.json
drwxrwxr-x. 9 minecraft minecraft      166 26. Mär 21:38 world

server.sh 시작:

#!/bin/bash
echo I am starting server now
now=$(date +%d_%m_%Y_%H_%M_%S)
/usr/bin/java -Xmx4096M -Xms4096M -jar minecraft_server.jar nogui

/usr/bin/startup-minecraft-서버:

#!/bin/sh
SERVICE_NAME=Minecraft-Server
PID_PATH_NAME=/tmp/minecraft-server.pid
case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
            exec /home/minecraft/server/startup-server.sh > /dev/null 2>&1 & echo $! > $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
           $0 stop
       $0 start
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    status)
    if [ -e $PID_PATH_NAME ]; then
            echo minecraft server is running, pid=`cat $PID_PATH_NAME`
    else
            echo minecraft server is NOT running
        exit 1
    fi
   ;;
*)
   echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

내가 전화할 때마다

startup-minecraft-server start

그것은 나에게 말한다 :

./startup-minecraft-server start
Starting Minecraft-Server ...
Minecraft-Server started ...

상태를 확인하세요.

./startup-minecraft-server status
minecraft server is running, pid=30639

하지만

ps -p 30639 -o comm=

아무것도 나오지 않았습니다. 왜 이런 일이 발생하는지 모르겠습니다.

편집하다:

스크립트를 수정했지만 여전히 이전과 동일한 결과를 얻습니다.

#!/bin/sh
SERVICE_NAME=Minecraft-Server
PATH_TO_JAR=/home/minecraft/server/minecraft_server.jar
PID_PATH_NAME=/tmp/minecraft-server.pid
case $1 in
    start)
    echo "Starting $SERVICE_NAME ..."
    if [ ! -f $PID_PATH_NAME ]; then
        exec /usr/bin/java -Xmx4096M -Xms4096M -jar $PATH_TO_JAR nogui > /dev/null 2>&1 & echo $! > $PID_PATH_NAME
        echo "$SERVICE_NAME started ..."
    else
        echo "$SERVICE_NAME is already running ..."
    fi
    ;;
    stop)
    if [ -f $PID_PATH_NAME ]; then
        PID=$(cat $PID_PATH_NAME);
        echo "$SERVICE_NAME stoping ..."
        kill $PID;
        echo "$SERVICE_NAME stopped ..."
        rm $PID_PATH_NAME
    else
        echo "$SERVICE_NAME is not running ..."
    fi
    ;;
    restart)
    if [ -f $PID_PATH_NAME ]; then
        $0 stop
        $0 start
    else
        echo "$SERVICE_NAME is not running ..."
    fi
    ;;
    status)
    if [ -e $PID_PATH_NAME ]; then
        echo minecraft server is running, pid=`cat $PID_PATH_NAME`
    else
        echo minecraft server is NOT running
    exit 1
    fi
    ;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0

답변1

exec /home/minecraft/server/startup-server.sh > /dev/null 2>&1 & echo $!

startup-server.sh거의 즉시 종료되는 PID를 제공합니다. 하지만 원하는 PID는

/usr/bin/java -Xmx4096M -Xms4096M -jar minecraft_server.jar nogui

업무 방식에 따라 다음이 필요합니다.

exec /usr/bin/java -Xmx4096M -Xms4096M -jar minecraft_server.jar nogui

게다가 그것만으로는 if [ -f $PID_PATH_NAME ]충분하지 않습니다. 프로세스가 여전히 존재하고 올바른지 항상 확인해야 합니다.

유사한 것을 사용하는 것이 합리적일 수 있습니다 startproc.

답변2

이는 스크립트(새로운 bash 프로세스) PID에서 반환됩니다. 이 명령으로 이를 가져와야 /home/minecraft/server/startup-server.sh합니다 .PID/usr/bin/java -Xmx4096M -Xms4096M -jar minecraft_server.jar nogui

답변3

이 줄로 문제가 해결되었습니다.

데몬을 제거하고 $!를 echo하려면 >를 추가하세요.

/usr/bin/java -Xmx4096M -Xms4096M -jar $PATH_TO_JAR nogui > /dev/null 2>&1 & echo $! >>$PID_PATH_NAME

나도 그랬다:

cd /home/minecraft/server/
pwd

스크립트 시작 부분에

관련 정보