当以非特权用户身份运行作业时,在“/var/run”中创建一个文件夹

当以非特权用户身份运行作业时,在“/var/run”中创建一个文件夹

我有一些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-startand之后sudo start my-service使用的。

如何在服务启动之前创建文件夹并设置权限?

答案1

  1. 对于任何与 init 系统有关的事情来说,sudo 都不是合适的工具。如果可能的话,避免使用它。

  2. setuid 和 setgid 影响 upstart 作业的所有节,包括预启动。

  3. 使用以下作业 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,并且不会遇到任何权限错误。

相关内容