PIDを変更するパイプコマンド

PIDを変更するパイプコマンド

実行可能な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-daemonJavaプロセスの代わりにJavaプロセスに書き込みます。したがって、停止はもはや機能しません。PIDmultilog$PIDFILEPID

これが発生するのを防ぐために使用できる「パイプ魔法」はありますか? :)

答え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)

関連情報