http://www.freedesktop.org/software/systemd/man/systemd.exec.html
there are a lot of Scheduling options

Am 31.12.2012 02:50, schrieb JB:
> 
> Bottom line is I need to give a process started by systemd and any process 
> started by that process some privileges
> to chanage scheduler and other things when it starts.  How do I tell systemd 
> to grant these privileges to one of
> it's services?
> 
> Here's all the detail:
> 
> I'm having a really frustrating problem.  I have a ruby webrick daemon that 
> starts up at boot.  Previously it
> always started from init and that always worked fine right up through fedora 
> 8 on a 2.6.29.9 kernel.  Now I'm
> running the following:
> OS: Fedora Core 15
> Kernel: 2.6.38.8 64-bit with RTAI patches
> SELinux is disabled
> 
> I did manage to get the thing to start using the following service file:
> *********** BEGIN webrickd.service ************
> [Unit]
> Description=Configuration ruby webrick daemon
> After=network.target
> 
> [Service]
> Type=forking
> WorkingDirectory=/home/rtuser/app/bin
> PIDFile=/home/rtuser/app/data/logs/webrickd.pid
> ExecStartPre=/home/rtuser/app/system/scripts/preStart.sh
> ExecStart=/home/rtuser/app/bin/webrickd.rb -d -p 
> /home/rtuser/app/data/logs/webrickd.pid
> StandardOutput=null
> StandardError=null
> User=rtuser
> Group=rtuser
> 
> [Install]
> WantedBy=multi-user.target
> *********** END webrickd.service *************
> 
> This webrick daemon upon receiving a specific web service call uses "exec" to 
> start another process called appcore
> which is a compiled C application.  appcore runs real-time and consequently 
> uses a call to sched_setscheduler() to
> change it's scheduling from the default.  Sample code for reproduction is 
> below:
> 
> *********** BEGIN appcore.c *************
> #include <stdio.h>
> #include <errno.h>
> #include <sched.h>
> 
> int main(int argc, char *argv[])
> {
>  struct sched_param mysched;
> 
>  errno = 0;
>  mysched.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1;
>  if( sched_setscheduler( 0, SCHED_FIFO, &mysched ) == -1 ) {
>    puts("appcore: ERROR IN SETTING THE SCHEDULER");
>    perror("errno");
>    return 1;
>  } // end
> if                                                                            
>                                                                               
>                                                                  
> 
>  return 0;
> }
> ************** END appcore.c **************
> 
> compile with gcc -o appcore appcore.c
> 
> Running the above program will work with a normally created unprivileged user 
> account but only when logged in with
> a PAM session using an interactive shell.  As soon as I try to start this up 
> from anything that is started by
> systemd, it yields an "Operation not permitted" error.  I realize there are 
> other ways to specify what scheduling
> service a process should have in the above systemd configuration file, but 
> that does not solve my problem.  Even
> without this call, the RTAI extensions I use which use a call to 
> rtai_task_init() also apparently require this same
> privilege (or one like it) because it too fails with "Operation not 
> permitted" so even if I tell systemd to give
> the ruby webrickdaemon SCHED_FIFO priority and I can somehow get that 
> inherited to appcore, I will still have the
> same problem, because there is no way for systemd to create a real-time task 
> using the RTAI extensions for me
> before my program starts.  I've tried all the following (and their 
> combinations) without success:
> 
> LimitCPU=infinity
> LimitFSIZE=infinity
> LimitDATA=infinity
> LimitSTACK=infinity
> LimitCORE=infinity
> LimitRSS=infinity
> #LimitNOFILES=infinity # using any variety of this fails no matter what
> LimitAS=infinity
> LimitNPROC=infinity
> LimitMEMLOCK=infinity
> LimitLOCKS=infinity
> LimitSIGPENDING=infinity
> LimitMSGQUEUE=infinity
> LimitNICE=infinity
> LimitRTPRIO=infinity
> LimitRTTIME=infinity
> CapabilityBoundingSet=~CAP_SYS_PTRACE
> PAMName=appcore
> 
> Modifications to /etc/security/limits.conf of course don't really help 
> because it works fine under a shell without
> any modifications and that stuff all gets bypassed with init processes 
> starting even when you specify User and
> Group.  I've tried using sudo (won't even start it) to try to get a PAM 
> session as though it were a login, I've
> tried setuid without success, I've tried everything I can think of but 
> absolutely everything works when run from an
> interactive shell and absolutely nothing works, all I get is "Operation not 
> permitted" anytime I let systemd start
> things up.  Please help!  I'm desperate.  I get what you're trying to do with 
> systemd and I support it and I have
> to say for a first release of it, it seems well designed and thought out.  
> I'm impressed with it's flexibility. 
> However, I quite literally ***cannot find a way to make this work*** when it 
> just "worked" before.  What in the
> world do I have to do to have systemd start this process up with whatever 
> equivalent rights or permissions it used
> to have with init and whatever it seems to have when run from an interactive 
> shell.
> 
> _______________________________________________
> systemd-devel mailing list
> systemd-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel

-- 

Reindl Harald
the lounge interactive design GmbH
A-1060 Vienna, Hofmühlgasse 17
CTO / CISO / Software-Development
p: +43 (1) 595 3999 33, m: +43 (676) 40 221 40
icq: 154546673, http://www.thelounge.net/

http://www.thelounge.net/signature.asc.what.htm

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to