Trying to get pid from a script running as su -c
I am trying to get these scripts to work in an environment where the java application needs to run as user foobar no matter if it is started as root или же foobar,
So these are my modifications to the init script, which is symlinked from init.d:
RUN_USER=foobar
USER_NAME=$(id --user --name)
START_SCRIPT=/opt/app/scripts/start
ARGS=""
start() {
if [ "$USER_NAME" != "$RUN_USER" ]; then
PID=$(su $RUN_USER -c $START_SCRIPT $ARGS > /dev/null 2>&1 & echo $!)
else
PID=`$START_SCRIPT $ARGS > /dev/null 2>&1 & echo $!`
fi
}
И мой /opt/app/scripts/start скрипт выглядит так:
exec java -jar /opt/app/app.jar > /dev/null 2>&1 & echo $!
Чтобы сделать init скрипт работает PID переменная должна быть установлена правильно, но она устанавливается на PID из su команда. Есть много вопросов о том, как заставить это работать, но ни одно из решений не работает для меня. Я понимаю что > /dev/null 2>&1 & echo $! часть моей su команда не работает, но она не работает, когда я изменяю ее на > /tmp/foobar либо (файл не записывается), и я не знаю, как заставить его работать. su команда сама по себе (su foobar -c /opt/app/scripts/start) выведет PID должным образом.
1 ответ
Вы повторили jav pid внутри / opt / app / scripts / start script, который является верным, но снова повторили pid команды su внутри сценария инициализации. Я думаю, что вы должны изменить скрипт инициализации следующим образом:
start() {
if [ "$USER_NAME" != "$RUN_USER" ]; then
PID=$(su $RUN_USER -c "$START_SCRIPT $ARGS")
else
PID=`$START_SCRIPT $ARGS`
fi
}