Linux 使用启动停止守护程序启动时未启动脚本

Linux 使用启动停止守护程序启动时未启动脚本,linux,ubuntu,daemon,boot,upstart,Linux,Ubuntu,Daemon,Boot,Upstart,我的脚本(位于/etc/init.d中)正在创建一个pid文件($PIDFILE),但没有进程在运行。我的守护程序脚本包括: start-stop-daemon --start --quiet --pidfile $PIDFILE -m -b --startas $DAEMON --test > /dev/null || return 1 手动执行脚本时,脚本工作正常。您需要这样做 然后重新启动SCRIPT\u NAME是/etc/init.d中的脚本名称(没有路径)能够让它工作,但尝试

我的脚本(位于/etc/init.d中)正在创建一个pid文件($PIDFILE),但没有进程在运行。我的守护程序脚本包括:

start-stop-daemon --start --quiet --pidfile $PIDFILE -m -b --startas $DAEMON --test > /dev/null || return 1
手动执行脚本时,脚本工作正常。

您需要这样做


然后重新启动
SCRIPT\u NAME
/etc/init.d
中的脚本名称(没有路径)

能够让它工作,但尝试了很多东西,不知道是什么修复了它(可能是脚本或配置中的错误)。然而,我学到了很多东西,想与大家分享,因为我在互联网的深渊中找不到同样的东西

看起来Ubuntu(以及许多其他基于Ubuntu的发行版,包括Mint)已经迁移到Upstart进行作业和服务管理。Upstart包括SysVinit(使用/etc/init.d守护进程)兼容性,仍然可以使用update rc.d来管理守护进程(因此,如果您熟悉该用法,可以继续使用它)。Upstart方法是使用/etc/init文件夹中的单个.conf文件。我的SCRIPT.conf文件非常简单(我使用的是python脚本):

这个简单的文件用case语句完全替换了/etc/init.d中的标准脚本,以提供[start | stop | restart | reload]函数和指向/usr/bin/script的指针。您可以看到,它包括通常在/etc/rc*.d文件中可以找到的运行级控制(从而消除了几个文件)

我尝试更新rc.d,为我的守护进程创建必要的/etc/rc*.d/文件。我的daemon bash脚本位于/etc/init.d中,与我的原始问题一样,它包含start-stop daemon命令。(该命令在终端上也可以正常工作。)

我有/etc/rc*.d/files,/etc/init.d和/etc/init/script.conf文件中的bash脚本在引导期间,Upstart可能首先查找.conf文件的方向,因为SysVinit命令
服务脚本[start | stop | restart | reload]
返回未知实例,但是,您可以发现进程正在使用
ps-elf | grep SCRIPT_文件运行

需要注意的一件有趣的事情是,在使用.conf时,守护进程会分叉。上面编写的脚本只生成守护进程的一个分支。但是,通过使用
expect fork
expect daemon
respawn
,可以实现原始脚本的完全独立性(有关参考信息,请参阅)。使用这些命令将确保守护进程永远不会被杀死(至少通过使用kill命令)

通过使用
sudo initctl reload configuration
命令,我继续测试我的守护进程和引导进程。这将重新加载conf文件,您可以在其中通过
sudo[start | stop | restart]脚本测试守护进程。start命令的结果是:

$ sudo start SCRIPT
SCRIPT start/running, process xxxx

$ sudo restart SCRIPT
SCRIPT start/running, process xxxx

$ sudo stop SCRIPT
SCRIPT stop/waiting
另外,在/var/log/upstart/SCRIPT.log中有一个很好的日志,它为您的守护进程在引导期间提供了有用的信息。我的仍然有一个非常恼人的bug,它阻止root通过我的守护进程的notify send显示osd消息。我的日志文件包含gtk警告(我将打开另一个问题以寻求帮助)


希望这能帮助其他人开发他们的守护进程。

All/etc/rc*.d/包含并更新了脚本的文件夹和文件。此命令的结果是:/etc/init.d/timekpr的系统启动/停止链接已经存在。我还
sudo update rc.d-f SCRIPT\u NAME remove
sudo update rc.d SCRIPT\u NAME默认值
。该脚本能够生成pid,但没有为其运行的进程
ps pid
只返回一个空结果。使用的
sysv rc conf--list SCRIPT_NAME
结果为0:off 1:off 2:on 3:on 4:on 5:on 6:off,
runlevel
为n2。您正在运行什么类型的Linux发行版?Linux Mint基于debian,所以应该可以工作。不幸的是,目前没有薄荷测试系统。我目前无法验证所有这些信息,但非常感谢您的努力:)
start on filesystem or runlevel [2345]
stop on runlevel [016]

exec python /usr/share/python-support/SCRIPT/SCRIPT.py
$ sudo start SCRIPT
SCRIPT start/running, process xxxx

$ sudo restart SCRIPT
SCRIPT start/running, process xxxx

$ sudo stop SCRIPT
SCRIPT stop/waiting