Создание задания перезапуска перенаправить вывод как непривилегированный пользователь
В настоящее время я выполняю задание 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.log
а также app.err.log
записываются как root (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, хотя, возможно, есть более простые способы.