题 将脚本制作成linux服务


- 编辑,还有一些问题 -

好我的脚本使用循环来等待网络连接。因此,当我运行它时,即使使用守护进程,它也只是坐在那里而不是让我回到shell。我试过了 su -c "/home/webreports/report-list &" USER    但它试图以用户身份运行,即使我有引号,我甚至试过单引号。

- 原版的 - 我已经制作了一个脚本(尚未测试),用于将bash脚本作为服务运行。我有两个问题。

1)如何让它作为特定用户运行?我们使用的软件不能以root身份运行,并且如果它确实会崩溃(可怕的软件我们很遗憾)。那么如何让用户“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

5
2018-01-07 15:47




我认为不能以root身份运行是一个功能:)! - Zypher
除了它将让你以root身份运行然后更改所有权限并锁定所有人,然后崩溃。 - The Digital Ninja
什么分布? - Dennis Williamson
Redhat企业 - The Digital Ninja


答案:


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

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

哪里 johndoe 是您希望它运行的用户。

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


1
2018-01-07 15:57



我遇到的唯一问题是它似乎没有在后台运行脚本。我试过daemon su -c'/ home / webreports / report-listen&'USER但是它试图以用户身份运行,即使我在引号中也有它 - The Digital Ninja


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


1
2018-01-07 15:59





你还没有提到你正在使用的发行版,但似乎你正在使用基于Red Hat的发行版。我的答案就是基于这个假设。

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

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

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

1
2018-01-08 11:12





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

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

您将有一个pid文件也可用于干净的启动/停止。

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

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

这种方法只是一种尝试,而不是一种有效的接收者。我希望它有所帮助


0
2018-01-07 18:28





守护进程代码很难做到。为此,我使用daemontools - 基本上它完成了在后台运行的艰苦工作,你只需编写脚本,就像你要在前台运行它一样,然后告诉daemontools运行它。

看到 http://cr.yp.to/daemontools.html 对于所有的文件令人敬畏。


0
2018-01-08 07:52