Answers:
最简单的方法是使用su(1)命令,它具有允许您通过用户的外壳程序运行命令的选项,例如:
su foo -c ls
这将切换到用户foo并运行ls命令。如果您要使用的用户没有有效的外壳程序(即不在/ etc / shells中,如/ bin / false或/ sbin / nologin),则还必须在命令行上指定外壳程序。输出示例:
# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
如果我su www-data
设置了所有var并运行,${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &
则会收到错误消息。我该如何解决呢?
su
接受一个参数,这是一个shell命令。您需要编写su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'
,并确保MONOSERVER
和WEBAPPS
被父shell导出。(注意:请不要这样做,su … -c "$MONOSERVER …"
因为如果任何变量包含shell特殊字符都将失败。)并且,如果您有专用的守护程序启动器(例如)start-stop-daemon
,请使用它。
如果start-stop-daemon
是您的系统上,你应该使用它,看看它的选项(尤其是-u
与-g
在这种情况下)。
(否则,你可能会使用的组合su
和sg
。)
更新:这是一些/etc/init.d/mpd
脚本的示例(使用start-stop-daemon
):
启动命令:
echo "Starting Music Player Daemon"
start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
--pidfile /var/run/mpd.pid --make-pidfile \
-- --no-daemon /etc/mpd.conf 2>/dev/null
随后的所有内容--
都是/usr/bin/mpd
程序本身的一个参数。(守护进程由start-stop-daemon脚本处理,因此mpd
请不要使用--nodaemon
。)
停止命令:
echo "Stopping Music Player Daemon"
start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
如果mpd
本身不是下降的特权,一个需要添加(例如)-u mpd
,-g mpd
选项的start-stop-daemon
命令。
Usage: su [options] [LOGIN]
和su: unrecognized option '--debug'