我试图让这些脚本在Java应用程序需要以用户foobar运行的环境中工作,而不foobar是以root还是foobar启动的。
所以这些是我对init脚本的修改,它是从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脚本工作, PIDvariables需要被正确设置,但是它被设置为su命令的PID 。 关于做这个工作有很多问题,但是没有一个解决scheme适用于我。 我知道> /dev/null 2>&1 & echo $! 我的su命令的一部分不起作用,但是当我把它改成> /tmp/foobar (不写),我不知道如何使它工作。 su命令( su foobar -c /opt/app/scripts/start )会自动输出PID 。
你在/ opt / app / scripts / start脚本里回显了java pid,这个脚本是真的,但是在init脚本中又一次回显了su命令的pid。 我认为你应该像这样改变init脚本:
start() { if [ "$USER_NAME" != "$RUN_USER" ]; then PID=$(su $RUN_USER -c "$START_SCRIPT $ARGS") else PID=`$START_SCRIPT $ARGS` fi }