【问题标题】:Stopping nodejs service does not kill node process when wrapped in "script" command包装在“脚本”命令中时,停止 nodejs 服务不会终止节点进程
【发布时间】:2014-03-01 00:20:10
【问题描述】:

我在 Windows XP 32 位主机上的 VirtualBox 中运行 turnkey-node (Debian Wheezy) 设备。

在 Debian 客户机中,我做了一些修改,以便它运行我自己的 NodeJS 应用程序,而不是默认的。

我还修改了示例 run.sh 脚​​本,使其不再直接运行 node,而是运行 script 命令,该命令又运行 node,这样我就可以将其输出记录到文件并欺骗节点认为它正在使用 TTY 以便在日志输出中保留颜色转义序列,如 hereherehere 所讨论的。

这一切都很好,除非需要关闭 nodejs 服务——scriptshnode 进程在服务停止后都继续存在。

任何想法为什么会发生这种情况?我猜包含的nodejs init script 不打算像这样使用,但我不知道改变它来解决这个问题的第一件事。

以下是我提到的更改:

  • 修改/etc/default/nodejs 指向我自己的应用程序的run.sh
  • 修改run.sh,如下所示:

    #!/bin/sh
    
    cd `dirname $0`
    script -qfc "node server.js" server.log
    

为了让 nodejs 与 VirtualBox 共享文件夹功能一起工作,还有一些小的修改,但我认为这不是重点。

【问题讨论】:

  • 好吧,你可以使用kill 命令,但它可能不是推荐的方式。
  • 我链接到包含的初始化脚本,它本身使用kill,但也许不是kill是对的吗?

标签: linux node.js bash init


【解决方案1】:

在你的脚本前加上exec

当您在脚本中只说“foo”时,脚本会派生出一个子进程并运行它,然后当它退出时,shell 会继续执行下一个命令。因此,您的“init”将“shell”视为子项,而 node 是孙子项。

如果你说exec script -qfc "node server.js" server.log,那么你是在告诉shell 不要派生一个孩子,而是直接执行命令并且永不返回。这样,您的 init 脚本会将节点视为子节点,并直接发送节点信号。

【讨论】:

  • +1 听起来很合法,虽然我在全新的 VM 上没有任何运气,但我必须等到星期一才能在我一直在努力的那个上试用它.
  • 我无法让它工作。我想我在问这个问题时一定忽略了一些事情,因为service nodejs status 认为该服务根本没有运行,即使前面有 exec。
猜你喜欢
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2017-09-17
  • 2011-11-16
  • 2021-11-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多