我正在努力这些脚本在 Java 应用程序需要以用户身份运行的环境中工作,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
脚本工作,PID
需要正确设置变量,但它被设置为命令PID
的su
。关于如何使它工作,有多个问题,但没有一个解决方案对我有用。我知道> /dev/null 2>&1 & echo $!
我的su
命令的一部分不起作用,但当我将其更改为(没有文件被写入)时它不起作用> /tmp/foobar
,我不知道如何让它工作。命令su
本身(su foobar -c /opt/app/scripts/start
)将正确输出PID
。
答案1
你在里面回显了 java pid/opt/app/scripts/start脚本是正确的,但再次回显了苏命令。我认为你应该像这样更改 init 脚本:
start() {
if [ "$USER_NAME" != "$RUN_USER" ]; then
PID=$(su $RUN_USER -c "$START_SCRIPT $ARGS")
else
PID=`$START_SCRIPT $ARGS`
fi
}