26

I have an init script to kick off a daemon. The problem is it runs as root. I would like it to run as a user called "deploy". Ubuntu 12.04

#! /bin/sh

# File: /etc/init.d/unicorn

### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the unicorn web server
# Description:       starts unicorn
### END INIT INFO

DAEMON=/usr/local/bin/unicorn_rails
DAEMON_OPTS="-c /var/www/current/config/unicorn.rb -D"
NAME=unicorn
DESC="Unicorn"
PID=/var/www/current/shared/pid/unicorn.pid

case "$1" in
  start)
    echo -n "Starting $DESC: "
    $DAEMON $DAEMON_OPTS
    echo "$NAME."
    ;;
  *)
    echo "Usage: $NAME {start|stop|restart|reload}" >&2
    exit 1
    ;;
esac

exit 0
CT.
  • 413
  • 1
  • 5
  • 6
  • 2
    Change `$DAEMON $DAEMON_OPTS` to `su - deploy -c "$DAEMON $DAEMON_OPTS"` – daisy Dec 01 '12 at 09:56
  • Beware not to launch the deamon using the "service" command while you are testing since the chuid option will have no effect and the process will run as root. – pasqal Sep 15 '15 at 14:49
  • Are all scripts in init.d called *after* kernel already knows the users in system ? – ransh Mar 19 '17 at 10:06

2 Answers2

24

Use the start-stop-daemon utility to start your daemon. Pass the -c (or --chuid) option to run it as a different user. You'll find some examples in /etc/init.d/*.

case $1 in
  start)
    echo -n "Starting $DESC: "
    start-stop-daemon --start --chuid deploy --pidfile "$PID" --start --exec "$DAEMON" -- $DAEMON_OPTS
    echo "$NAME."
    ;;
…
bschlueter
  • 147
  • 1
  • 10
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
  • Are all init.d scripts called after kernel already knows all users in system ? – ransh Mar 19 '17 at 10:07
  • @ransh I'm not sure what you're asking. The kernel does not really “know” users: as far as it's concerned, a user is just a number, and it doesn't care what the number is except that processes running as user 0 can do many things that other users can't. – Gilles 'SO- stop being evil' Mar 19 '17 at 21:52
-1

On Ubuntu you can use just

sudo -u deploy $DAEMON $DAEMON_OPTS