1

В настоящее время я выполняю задание 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 ответ1

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, хотя, возможно, есть более простые способы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .