у меня есть несколько upstart
скрипты, которые запускаются от имени непривилегированного пользователя, используя setuid
. Pid-файлы должны быть созданы в /var/run/my-service
: /var/run/my-service/v1.pid
, /var/run/my-service/v2.pid
и так далее.
Скрипты выскочки создаются скриптом, который также создает /var/run/my-service
и устанавливает разрешения, так что изначально все работает. Но эта папка исчезнет после перезагрузки, и службы не будут работать.
Я пробовал это:
pre-start script
[ -n $PID_DIR ] && [ ! -d $PID_DIR ] && mkdir $PID_DIR
sudo chown my-user:my-group $PID_DIR
end script
setuid my-user
Но не работает:
sudo: no tty present and no askpass program specified
my-user is not in the sudoers file. This incident will be reported.
Я думаю это потому что setuid
влияет на все процессы, даже если это после pre-start
и sudo start my-service
использовался.
Как я могу создать папку и установить разрешения до запуска службы?
sudo не подходит ни для чего, что касается систем инициализации. пожалуйста по возможности избегайте его использования.
setuid и setgid влияют на все строфы задания выскочки, включая предварительный запуск.
Это можно легко обойти с помощью следующего задания my-service-prepare.conf:
start on starting my-service
task
PIDDIR=/var/run/my-service
exec install -o my-user -g my-group -d $PIDDIR
При этом вы можете использовать setuid и setgid в основном задании выскочки и не сталкиваться с какими-либо ошибками разрешений.