使脚本成为一个Linux服务

– 编辑,还有一些问题 –

OK我的脚本使用一个循环来等待networking连接。 所以当我运行它时,即使是守护进程,它也会坐在那里,不会把我带回壳。 我尝试了su -c "/home/webreports/report-list &" USER但它试图以用户身份运行,即使我在引号中,我甚至试过单引号。

– 原始 – 我做了一个脚本(还有待testing)作为服务运行一个bash脚本。 我有两个问题。

1)我如何获得它作为一个特定的用户运行? 我们使用的软件不能以根用户身份运行,如果它真的发生了可怕的错误(可怕的软件,我们可悲的坚持)。 那么我如何让它运行服务作为用户“JOEBOB”可以说。

2)我只是把脚本文件放到“/etc/rc5.d”中才能使用“service report-listen start”?

—脚本 –

 #!/bin/sh # # myservice This shell script takes care of starting and stopping # the /home/webreports/report-listen # # Source function library . /etc/rc.d/init.d/functions # Do preliminary checks here, if any #### START of preliminary checks ######### ##### END of preliminary checks ####### # Handle manual control parameters like start, stop, status, restart, etc. case "$1" in start) # Start daemons. echo -n $"Starting report-listen daemon: " echo daemon /home/webreports/report-listen echo ;; stop) # Stop daemons. echo -n $"Shutting down report-listen: " killproc /home/webreports/report-listen echo # Do clean-up works here like removing pid files from /var/run, etc. ;; status) status /home/webreports/report-listen ;; restart) $0 stop $0 start ;; *) echo $"Usage: $0 {start|stop|status|restart}" exit 1 esac exit 0 

使用su以不同的用户身份运行脚本:

 daemon su -c /home/webreports/report-listen johndoe 

johndoe是你想运行的用户。

将脚本放在/etc/init.d/myservice中,然后将其链接到/etc/rc.d/S99myservice。

只是复制不会做这个工作。 你必须注意程序与stdin和stdout是分离的。 因此,所有输出都必须打印到日志文件中。 你也必须后台程序,这应该由守护进程function完成。

你还没有提到你使用的是什么发行版,但是好像你使用的是基于红帽的发行版。 我将基于这个假设回答我的答案。

回答你的问题的第一部分,关于在启动时运行脚本。 您必须将脚本放在/etc/rc.d/init.d中,然后添加一个“chkconfig”兼容行,以允许您使用“chkconfig”命令将其添加到正确的级别。 看到关于这个问题的前一个问题。

至于用特定的用户启动脚本。 由于您已经在使用“守护程序”function,因此您可以尝试使用“ –user ”开关:

 daemon --user=reportsuser /home/webreports/report-listen 

如果您使用Ubuntu(基于Debian的操作系统),您可以将脚本build立在/etc/init.d/skeleton上,并replaceDAMEON var:

 DAEMON=su -c "/home/webreports/report-listen" joebob 

你将有一个PID文件也干净启动/停止。

您可以在启动时自动启动它(假设您的服务脚本名为/etc/init.d/my-report-listen):

 $ sudo update-rc.d my-report-listen defaults 

这种方法只是一个尝试,而不是一个有效的收件人。 我希望它有帮助

守护代码很难正确。 为此,我使用daemontools – 基本上它在后台运行很辛苦,并且只需编写脚本就好像要在前台运行它,然后告诉daemontools运行它。

请参阅http://cr.yp.to/daemontools.html,了解所有文档。