32

I want to execute a script every time my server start up. The problem is that I need to be a certain user to execute the script, if I try to do it as root it cant find certain packages (such as ruby).

I try to change to xxx user01.

sudo su user01
/etc/init.d/script start

This doesn't work however.

4

4 Answers 4

33

Running sudo su user01 in a script does not mean the following commands are sent to the resultant shell. In fact, it likely means a new shell is spawned as user01, which never exits!

Two things:

  • You can execute a command as another user either by passing the -c 'command...' argument to su, like su user01 -c '/etc/init.d/script start'.
  • Starting a service that uses /etc/init.d from rc.local isn't the correct thing to do. You want to use enable the service at startup using your distribution tools, like chkconfig or update-rc.d. You also don't want jobs in /etc/init.d that shouldn't be started as root. The jobs themselves can feel free to fork to another user account, but should be invoked by root.
0
9

You could put something in /etc/crontab and run it @reboot

@reboot username /etc/init.d/script start
1
  • 2
    or in the user's own crontab file.
    – Jake
    Nov 7, 2016 at 23:46
9

You can just run the command through sudo like this:

sudo -H -u user01 /etc/init.d/script start

-H sets the HOME environment variable to that of the user

-u specifies the username to run as

0
0

Surely you can't run that script with sudo because of requiretty ( enforces that users must be logged) in sudoers. You may want disable, which is somewhat risky

Also there is a somewhat old tool called runsuid: http://freecode.com/projects/runsuid

HTH

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.