我的 apache 在启动和手动使用时运行良好/etc/init.d/apache2 start
,我对此没有异议,但其中一个服务器管理器习惯于使用服务命令,并且由于某种原因,apache 无法通过服务正常运行。
如果我直接运行它,我会得到:
Start
...[OK]
Stop
...[OK]
Help
Usage: /etc/apache2/bin/httpd [-D name] [-d directory] [-f file]
...
但是当我尝试通过服务命令运行它时,我得到:
Start
start: Job failed to start
Stop
stop: Unknown instance:
Help
Usage: /etc/apache2/bin/httpd [-D name] [-d directory] [-f file]
...
我以前以为他们指向不同的可执行文件,但根据 help 的用法输出,它们都指向/etc/apache2/bin/apachectl
,而 又指向/etc/apache2/bin/httpd
。此外这向我表明服务无法找到正在运行的 httpd 进程(可能是因为它被称为 httpd 而不是 apache2)。
为什么调用同一个 exe(它实际上是一个脚本,但这并不重要)的这两种方法会有不同的结果?
答案1
经过一些研究和处理文件后,我找到了问题所在。
对我来说,问题在于 Upstart 与 sysvinit 的向后兼容性导致两个文件之间出现明显的冲突。Upstart 支持具有向后兼容性的目录中的脚本/etc/init.d
,因为这是 sysvinit 用于脚本的旧目录。然而,Upstart 使用/etc/init/
它的脚本。预期用途是将脚本放在一个或另一个目录中。我的问题归结为我同时拥有这两个目录(我仍然不确定脚本是如何/etc/init/
到达那里的)。由于脚本/etc/init
不是功能性脚本(它指向了错误的 apache exe),它在启动时失败,这很好,因为 init.d 中的脚本正在运行。但是,一旦我尝试通过服务运行它,错误就变得明显了。
我删除了它/etc/init/apache2.conf
,现在服务 apache2 可以像我希望的那样正确指向 init.d 中的脚本。