実行可能な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)