尝试从以 su -c 运行的脚本中获取 pid

尝试从以 su -c 运行的脚本中获取 pid

我正在努力这些脚本在 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需要正确设置变量,但它被设置为命令PIDsu。关于如何使它工作,有多个问题,但没有一个解决方案对我有用。我知道> /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
}

相关内容