管道命令更改 PID

管道命令更改 PID

我为可执行 Jar 文件创建了一个 (Debian) init 脚本:

[...]
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 --
[...] 

我的 init 脚本基本上只是调用start-stop-daemon执行 shell 脚本:

#!/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

日志记录工作完美,但现在将 ofstart-stop-daemon写入而不是我的 java 进程(因此停止不再起作用)。PIDmultilog$PIDFILEPID

是否有任何“管道魔法”可以用来防止这种情况发生? :)

答案1

使用 bash 运行脚本并使用进程替换构造来执行日志记录。这样,您的“主”进程仍将使用与 shell 相同的进程 ID 来执行。

当您执行此操作时,请使用数组 for JAVA_OPTIONS,因为它是单词列表。这样你的脚本即使包含 shell 特殊字符也不会$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)

相关内容