使 upstart 作业以非特权用户身份重定向输出

使 upstart 作业以非特权用户身份重定向输出

我目前正在以非特权用户身份运行一项 upstart 作业,如下所示:

start on started mongodb
stop on runlevel [06]

respawn
respawn limit 10 100

env NODE_ENV=production

pre-start script
    ulimit -n 2048
end script

exec sudo -u mainuser /usr/bin/make -C /home/mainuser/app start-prod >> /home/mainuser/data/logs/app.log 2>> /home/mainuser/data/logs/app.err.log

这很好,但有一个例外:日志文件app.logapp.err.logroot 身份写入(root 成为这些文件的所有者)。

我如何确保日志文件是由非特权用户写入的mainuser

答案1

我脑海中浮现出一些想法:你可以用来| sudo -u mainuser tee写入文件(但如果你想分割 STDOUT 和 STDERR,它可以变得有点混乱),或者您可以在脚本中检查日志文件是否存在并且归 拥有mainuser,如果不存在则创建 并chown mainuser。然后像您所做的那样附加输出将保留所有权。

快速片段:

#!/bin/sh
user="mainuser"
group="mainuser"
for i in /home/mainuser/data/logs/app.log /home/mainuser/data/logs/app.err.log; do
    if [ ! -f "${i}" ] || [ "$(stat -c%U -- "${i}")" != "${user}" ]; then
        touch -- "${i}"
        chown ${user}:${group} -- "${i}"
    fi
done

这很快,并且不能很好地处理诸如日志文件作为目录/链接存在的情况等,但在实践中可能没问题。

不过我还没有使用过 Upstart,所以也许有更简单的方法。

相关内容