실행 가능한 Jar 파일에 대한 (Debian) 초기화 스크립트를 만들었습니다.
[...]
NAME=NameOfMyShellScript
DAEMON="/usr/share/myApp/bin/$NAME"
USER="myUser"
PIDFILE="/usr/share/myApp/run/$NAME.pid"
EXTRA_ARGS=" -c $USER --background --make-pidfile"
[...]
start-stop-daemon --start --quiet $EXTRA_ARGS --pidfile $PIDFILE --startas $DAEMON --
[...]
내 초기화 스크립트는 기본적으로 start-stop-daemon
실행 셸 스크립트를 호출합니다.
#!/bin/sh
XNAME="hellofellow_1"
SCALATRA_ENV="development"
TMP_DIR="tmp/$XNAME/"
JAVA_OPTIONS="-Xmx2024M -XX:MaxPermSize=512M"
LOGFILE="logs/$XNAME.log"
PORT="8080"
JAVA_OPTIONS="$JAVA_OPTIONS -Djava.io.tmpdir=$TMP_DIR \
-Dorg.scalatra.environment=$SCALATRA_ENV"
cd $(dirname $0)/../
rm -Rf $TMP_DIR*
exec java $JAVA_OPTIONS -jar current/myJarFile.jar $PORT > $LOGFILE
지금까지 이것이 작동하고 내 응용 프로그램이 실행되고 모든 출력이 기록됩니다 $LOGFILE
.
회전을 통해 로깅을 향상시키기 위해 다음을 수행해 보았습니다.
exec java $JAVA_OPTIONS -jar current/myJarFile.jar $PORT | multilog t s131072 n100 '!/bin/gzip' /my/log/dir
로깅은 완벽하게 작동하지만 이제 start-stop-daemon
Java 프로세스 대신 Java 프로세스에 기록합니다. 따라서 중지가 더 이상 작동하지 않습니다.PID
multilog
$PIDFILE
PID
이런 일이 발생하는 것을 방지하기 위해 사용할 수 있는 "파이프 마법"이 있습니까? :)
답변1
bash를 사용하여 스크립트를 실행하고 프로세스 대체 구성을 사용하여 로깅을 수행합니다. 이렇게 하면 "기본" 프로세스가 여전히 셸과 동일한 프로세스 ID로 실행됩니다.
JAVA_OPTIONS
이 작업을 수행할 때는 단어 목록이므로 배열을 사용하세요 . 이렇게 하면 스크립트에 쉘 특수 문자가 포함되어 있어도 스크립트가 $TMP_DIR
중단 되지 않습니다 $SCALATRA_ENV
.
#!/bin/bash
set -e
XNAME="hellofellow_1"
SCALATRA_ENV="development"
TMP_DIR="tmp/$XNAME/"
JAVA_OPTIONS=(-Xmx2024M -XX:MaxPermSize=512M)
LOGFILE="logs/$XNAME.log"
PORT="8080"
JAVA_OPTIONS=("${JAVA_OPTIONS[@]}" "-Djava.io.tmpdir=$TMP_DIR")
JAVA_OPTIONS=("${JAVA_OPTIONS[@]}" "-Dorg.scalatra.environment=$SCALATRA_ENV")
cd "$(dirname "$0")/../"
rm -rf "$TMP_DIR"/*
exec java "${JAVA_OPTIONS[@]}" -jar current/myJarFile.jar "$PORT" \
> >(multilog t s131072 n100 '!/bin/gzip' /my/log/dir)