【问题标题】:Why isn't stdout set after executing a child process in a node.js script that's running as a daemon?为什么在作为守护进程运行的 node.js 脚本中执行子进程后没有设置标准输出?
【发布时间】:2013-04-28 22:27:01
【问题描述】:

如果我从命令行 (node index.js) 运行它,这将按预期工作。但是,当我将这个 Node.js (v0.10.4) 脚本作为来自 init.d 脚本的守护进程执行时,未设置 exec 回调中的 stdout 返回值。我该如何解决这个问题?

node.js 脚本:

var exec = require('child_process').exec;
setInterval(function()
{
exec('get_switch_state', function(err, stdout, stderr) 
{
        if(stdout == "on")
        {
            // Do something.
        }
});
}, 5000);

init.d 脚本:

#!/bin/bash

NODE=/development/nvm/v0.10.4/bin/node
SERVER_JS_FILE=/home/blahname/app/index.js
USER=root
OUT=/home/pi/nodejs.log

case "$1" in

start)
    echo "starting node: $NODE $SERVER_JS_FILE"
    sudo -u $USER $NODE $SERVER_JS_FILE > $OUT 2>$OUT &
    ;;

stop)
    killall $NODE
    ;;

*)
    echo "usage: $0 (start|stop)"
esac

exit 0

【问题讨论】:

  • /home/pi/nodejs.log 显示什么?
  • 如果我将// Do something. 替换为console.log("got here"),它将显示“到达这里”,但如果我将其替换为console.log(stdout),它不会在日志文件中显示“开启”。

标签: node.js bash daemon


【解决方案1】:

我最终没有使用 Node.js exec child_process。我修改了上面的init.d脚本(/etc/init.d/node-app.sh)如下:

#!/bin/bash

NODE=/home/pi/development/nvm/v0.10.4/bin/node
SERVER_JS_FILE=/home/pi/development/mysql_test/index.js
USER=pi
OUT=/home/pi/development/mysql_test/nodejs.log

case "$1" in

start)
echo "starting node: $NODE $SERVER_JS_FILE"
sudo -u $USER TZ='PST' $NODE $SERVER_JS_FILE > $OUT 2>$OUT &
;;

stop)
killall $NODE
;;

*)
echo "usage: $0 (start|stop)"
esac

exit 0

此脚本在启动时启动 Node.js 应用程序“index.js”,一切正常。

【讨论】:

    猜你喜欢
    • 2023-03-02
    • 2011-01-03
    • 2013-10-14
    • 1970-01-01
    • 2013-05-11
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多