Boot

守護程序 - 如何告訴啟動守護程序以不同於 root 的使用者名執行此守護程序?

  • May 15, 2015

我有這個啟動腳本,當我啟動時,我通過使用者名執行執行:root,而不是使用者名:sun。

我如何告訴start_daemon以使用者名執行它:sun not root?

$ ps aux | grep python
root       950  0.1  0.2 171132 18936 ?        S    05:35   0:00 /usr/bin/python /var/tmp/mp.py

root@nson:/etc/rc0.d# cat K20mp 
#! /bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/var/tmp/mp.sh
PIDFILE=/var/run/mp.pid

test -x $DAEMON || exit 0

. /lib/lsb/init-functions

case "$1" in
 start)
    log_daemon_msg "Starting mp"
    start_daemon -p $PIDFILE $DAEMON --user sun --chuid sun
    log_end_msg $?
  ;;
 stop)
    log_daemon_msg "Stopping mp"
    killproc -p $PIDFILE $DAEMON
    PID=`ps x |grep mp.py | head -1 | awk '{print $1}'`
    kill -9 $PID       
    log_end_msg $?
  ;;
 force-reload|restart)
    $0 stop
    $0 start
  ;;
 status)
    status_of_proc -p $PIDFILE $DAEMON atd && exit 0 || exit $?
  ;;
*)
  echo "Usage: /etc/init.d/atd {start|stop|restart|force-reload|status}"
  exit 1
 ;;
esac
exit 0

編輯:參考不起作用

http://man.he.net/man8/start-stop-daemon

http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html

--user並且--chuid有效,但必須與start-stop-daemon一起使用。

範例:作為root使用者如果現在執行:/etc/init.d/PythonGUI啟動它以使用者名執行:sun

#! /bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Python GUI - Server"
NAME=PythonGUI.sh
DAEMON=/var/tmp/$NAME
DAEMON_ARGS="--options args"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/PythonGUI

[ -x "$DAEMON" ] || exit 0
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
   start-stop-daemon --start --quiet --user sun --pidfile $PIDFILE --chuid sun --exec $DAEMON --test > /dev/null \
       || return 1
   start-stop-daemon --start --quiet --user sun --pidfile $PIDFILE --chuid sun --exec $DAEMON -- \
       $DAEMON_ARGS \
       || return 2
}

do_stop() {
   start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
   RETVAL="$?"
   [ "$RETVAL" = 2 ] && return 2
   start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
   [ "$?" = 2 ] && return 2    
   rm -f $PIDFILE
   return "$RETVAL"
}

do_reload() {
   start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
   return 0
}

case "$1" in
 start)
   [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
   do_start
   case "$?" in
       0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
       2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
   esac
   ;;
 stop)
   [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
   do_stop
   case "$?" in
       0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
       2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
   esac
   ;;
 status)
   status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
   ;;
 restart|force-reload)
   log_daemon_msg "Restarting $DESC" "$NAME"
   do_stop
   case "$?" in
     0|1)
       do_start
       case "$?" in
           0) log_end_msg 0 ;;
           1) log_end_msg 1 ;; # Old process is still running
           *) log_end_msg 1 ;; # Failed to start
       esac
       ;;
     *)
       log_end_msg 1
       ;;
   esac
   ;;
 *)
   echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
   exit 3
   ;;
esac
:

編輯:

update-rc.d apache2 start 20 2 3 4 . start 30 5 . stop 80 0 1 6 .

  • 優先級 20(可以是 30、80 等)
  • 啟動/停止的執行級別

執行級別是任務的邏輯組。傳統上,您有五個執行級別。

0 boot
1 single user 
2 not used
3 multiuser
4 not used 
5 gui
6 reboot 

引用自:https://unix.stackexchange.com/questions/114826