我有一些upstart
以非特权用户身份运行的脚本setuid
. 应在以下位置创建 Pid 文件/var/run/my-service
:/var/run/my-service/v1.pid
,/var/run/my-service/v2.pid
等等。
upstart 脚本由一个脚本创建,该脚本还会创建/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
and之后sudo start my-service
使用的。
如何在服务启动之前创建文件夹并设置权限?
答案1
对于任何与 init 系统有关的事情来说,sudo 都不是合适的工具。请如果可能的话,避免使用它。
setuid 和 setgid 影响 upstart 作业的所有节,包括预启动。
使用以下作业 my-service-prep.conf 可以轻松解决这个问题:
start on starting my-service task PIDDIR=/var/run/my-service exec install -o my-user -g my-group -d $PIDDIR
这样,您可以在主 upstart 作业中使用 setuid 和 setgid,并且不会遇到任何权限错误。