• Windows下nginx报错解决:CreateFile() "xxx/logs/nginx.pid" failed


    写在前面

    本文给出Windows下nginx报错:CreateFile() "xxx/logs/nginx.pid" failed 的解决方法并分析了出错原因,其中 xxx 表示nginx的安装路径(即nginx.exe所在的路径)。注意,除非特别说明,否则后文一律使用 xxx 来表示nginx的安装目录。想直奔重点的读者请直接跳至解决小节,想了解原理的读者可以参考分析验证小节。

    正文

    现象

    在Windows下,当我们执行 nginx -s stop 或 nginx -s quit 或 nginx -s reload 时,可能会收到如下报错:

    nginx: [error] CreateFile() "D:/software/nginx/logs/nginx.pid" failed (2: The system cannot find the file specified)

    分析

    当我们使用 start nginx 来启动nginx时,会在 xxx/logs/ 目录下生成名为 nginx.pid 的文本文件,该文件的内容只有一个数字,即nginx.exe进程对应的PID。无论是stop,quit还是reload,都需要利用nginx.exe的PID对其进行操作。然而,在某些特殊情况下(下文中我们会人为制造一种特殊情况),nginx.pid会丢失,故而上述三个命令会因找不到nginx.pid而报错。显然,此时也不可能stop,quit或reload成功,因为nginx连自己对应哪个进程都不知道。

    解决

    简单粗暴:1)通过 tasklist | findstr "nginx.exe" 查出nginx.exe对应的PID;2)在 xxx/logs/ 下新建文本文件 nginx.pid ,通过文本编辑器将上一步的PID写入(当然,这一步也可以通过命令行、脚本、动手编程等一切能达到目的的方式进行);3)执行 nginx -s stop 或 nginx -s quit 或  nginx -s reload 。

    验证

    必读

    1. 本验证中,nginx安装路径为 D:/software/nginx ,监听端口为5000。
    2. 呈现方式是命令行截图。用到的命令会在后边以文本形式给出,方便读者复制粘贴。
    3. 本文仅重点关注“找不到nginx.pid”的问题,对于验证过程中衍生的其它问题,本文仅给出答案的链接,且不保证对症下药(不是说文档内容有误,而是不保证正好能解决对应的问题)。在此也恳请知道答案的读者不吝赐教。
    4. 验证过程中的命令必须在nginx安装目录下执行,否则会出错。如果非要在任意目录下执行,请参考在下的另一篇博客,同时,也要记着对相关路径做相应改动。

    验证过程如下图所示:

    验证过程

    其中,用到的命令整理如下:

    1 start nginx
    2 tasklist | findstr "nginx.exe"
    3 netstat -ano | findstr "5000"   # 需要将5000改为nginx实际监听的端口
    4 type ./logs/nginx.pid
    5 nginx -s quit
    6 cmd /r dir /b .\logs
    7 13632 | Out-File -Encoding ASCII ./logs/nginx.pid # 需要将13632改为实际的PID
    View Code

    上图中提到的参考文档为[1]、[2]、[3]。这里对文档的作者表示衷心的敬佩与感谢。

    写在后面

    再次感谢本文引用的所有文档的读者。

    在下刚接触nginx,本文为在下探索所得,错误疏漏之处在所难免,欢迎读者批评指正,您的批评是在下前进的不竭动力。

  • 相关阅读:
    下载视频
    009 逻辑 + MFC CString
    008 浅拷贝与深拷贝
    007 operator
    006 this指针原理
    005 逻辑 + STL list
    004 list::sort
    003 逻辑 + mfc CList
    001 C++历史和思想
    并查集模板
  • 原文地址:https://www.cnblogs.com/zpcdbky/p/15339213.html
Copyright © 2020-2023  润新知