O comando Piped muda o PID

2

Eu criei um script init (Debian) para um arquivo Jar executável:

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

Meu script de inicialização basicamente invoca start-stop-daemon , que executa um script de 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

Isso funciona até agora, meus aplicativos são executados e qualquer saída é gravada em $LOGFILE .

Para melhorar o registro com rotação, tentei algo como:

exec java $JAVA_OPTIONS -jar current/myJarFile.jar $PORT | multilog t s131072 n100 '!/bin/gzip' /my/log/dir

O registro em log funciona perfeito, mas agora start-stop-daemon grava o PID de multilog a $PIDFILE e não o PID do meu processo java (então parar não funciona mais).

Existe alguma "mágica de pipeline" que possa ser usada para evitar que isso aconteça? :)

    
por David Heidrich 24.10.2012 / 17:41

1 resposta

1

Execute seu script com o bash e use a construção de substituição do processo para executar o registro. Dessa forma, seu processo "principal" ainda será executado com o mesmo id de processo que o shell.

Enquanto você está nisso, use uma matriz para JAVA_OPTIONS , já que é uma lista de palavras. Dessa forma, seu script não será interrompido, mesmo se $TMP_DIR ou $SCALATRA_ENV contiverem caracteres especiais de shell.

#!/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)
    
por 25.10.2012 / 02:24

Tags