2016-01-29 15 views
5

automatisch ab Dies ist ein bisschen doozy. Dieses Problem ist höchstwahrscheinlich serverbezogen und meine erste Reaktion war AskUbuntu over here.Node's spawn() stürzt beim Aufruf aus einem forever Skript beim Booten ab

Ich versuche crontab oder rc.local oder init.d zu starten, um ein forever Skript beim Booten zu starten. Es hängt einen Server an einen Port an, den ich mit einigen Informationen anpingen kann, und lässt einen kopflosen Browser für mich laufen.

Das heißt, scheint es, dass ich nicht in der Lage, eine Antwort von Node.js des spawn() zu bekommen: den Benutzer

var CASPER_PATH = '/home/ubuntu/dev/casperjs/bin/casperjs'; // actual binary location, not a symlink 
var SCRIPTS_PATH = '/home/custom_user/endpoints/server.js'; 

var fileName = req.body.source + '_' + req.body.type + '.coffee'; // looks like: mysource_my_scrape_type.coffee 
var scrapeId = 'test_scrape'; 
var user = 'user123'; 
var pass = 'pass123'; 
if (fs.existsSync(SCRIPTS_PATH + fileName)) { 
    // If file is in place, spawn casperjs 
    var sP = spawn(CASPER_PATH, 
    [SCRIPTS_PATH + fileName, '--ssl-protocol=any', '--user='+user, '--scrapeId='+scrapeId, '--pass='+pass], 
    { detached: true }, 
    function (err, stdout, stderr) {}); 
    sP.stdout.on('data', function(data) { console.log('stdout', data.toString('utf8')); }); 
    sP.stderr.on('data', function(data) { console.log('stderr', data.toString('utf8')); }); 
    sP.stdout.on('close', function(code) { console.log('close', code); }); 
    res.send({ scheduled: true, key: scrapeId }); 
} else { 
    res.send({ scheduled: false, error: 'Incorrect source, type or the script is missing.' }); 
} 

Bevor ich hinzugefügt, um die PHANTOMJS_EXECUTABLE env crontab oder rc.local (tut, egal Rolle zu spielen Level), stdout war nützlich:

stdout Fatal: [Errno 2] Keine solche Datei oder Verzeichnis; hast du installiert phantomjs?

schließen falsch

Nun, da die Umwelt var ist, gibt es keinen Ausgang nach spawn() überhaupt.

Wohlgemerkt, Casper startet ganz gut, wenn ein Benutzer (beliebiger Berechtigungsstufe) node/forever von bash aus startet.

Wie kann ich sehen, warum spawn() fehlschlägt?

+0

Können Sie die vollständige Quelle Ihres Skripts hinzufügen? Was genau ist "Spawn"? Ich habe gerade [docs] (https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options) angesehen und es gibt keinen Fehler-Callback zu child_process.spawn(), wenn du diesen 'spawn' verwendest und dann versuchst, sP hinzuzufügen. on ('Fehler', ..) Handler und überprüfen Sie die Ausgabe. Es wäre auch gut, wenn Sie Ihre crontab oder init.d posten, so dass es einfacher wäre, Ihr Problem zu reproduzieren. –

Antwort

2

beantworten kann diese tatsächlich aussieht ein Combo-Bug zwischen forever, spawn und casperjs (vielleicht phantomjs). Ich konnte Ihr Problem reproduzieren, here is den vollständigen Code meiner Testanwendung.

Sie haben nicht den vollständigen Code angezeigt, also denke ich, dass Sie eine Express-Anwendung haben und es eine spezielle URL gibt, um das Casperjs-Skript auszuführen.

ich eine einfache App wie diese bauen und verhielt es sich so:

  • Nur App starten mit node script.js (script.js die Express-App ist, die das casperjs Skript in server.js läuft) - es funktioniert OK, macht Antwort und schreibt die Ausgabe von den Kindprozess-Ereignishandlern zur Konsole
  • App als root mit init.d script starten - funktioniert nicht, sobald das Kind erzeugt wird, werden keine Ereignishandler ausgelöst
  • App als root mit init.d starten Skript, ersetzen Casperjs mit echo - das gleiche tut funktioniert nicht (siehe, hier haben wir dieses Problem mit nur forever läuft als root, spawn und echo)
  • App starten als normaler Benutzer (nicht root) mit init.d, ersetzen casperjs mit "echo" - es funktioniert Event-Handler ausgelöst werden, hier war ich fast sicher, das Problem gelöst ist, aber ... :(
  • Starten Sie die App als normaler Benutzer (nicht root) mit init.d, setzen casperjs - es funktioniert nicht wieder sind, Event-Handler nicht
  • ausgelöst

Die praktische Lösung für dieses es pm2 zu verwenden, habe ich dieses:

# install pm2 
sudo npm install -g pm2 
# generate init.d scripts for pm2 
# this command will fail, but hint about the correct format with sudo 
pm2 startup ubuntu 
# do this in the folder with your application 
pm2 start script.js 
# remember your application 
pm2 save 
# also useful 
# sudo service stop/start/restart pm2 
# pm2 stop/start/restart script 

Jetzt startet pm2 automatisch mit dem System und es startet Ihre Anwendung. Alles funktioniert, Event-Handler für Child-Prozesse werden ausgelöst.

+1

Rock & Roll, Boris! –

0

Ich habe Ihre Anforderung nicht vollständig verstanden. Aber ich habe eine ähnliche Situation mit Ubuntu Headless Server.

was ich versuche, hier zu tun ist, was ich tat

Zuerst Wie meine crontab ist?

crontab -u USER -e 

@reboot exec sudo -u USER /bin/bash /home/USER/SHELL_SCRIPT.sh 

See, hier ich bin eigentlich ein Shell-Skript starten, und nicht einen Knoten Server

nun in diesem Shell-Skript (SHELL_SCRIPT.sh)

#! /bin/bash 
    # SHELL_SCRIPT.sh 
    cd /home/USER/ 
    /home/USER/.npm-packages/bin/forever start -p /home/USER -a -d --watch false --pidFile /home/USER/forever.pid -l /home/USER/forever.log -o /home/USER/forever.out -e /home/USER/forever.err /home/USER/MY_NODE.js 

und sogar in meinem MY_NODE. js ich folge dem absoluten Pfad, ich ignoriere einfach $ PATH und benutze das nicht.

Innerhalb dieser Knoten-Server, kann ich 100 von Laich

Nun, ich dies um 2 Jahre tat zurück, so dass, wenn Sie mich fragen, warum diese Art und Weise, die ich nicht

+0

Spawn Sie Casper oder Phantom speziell? –

+0

Nein, ich spawne viele andere Dinge und ich vermeide $ PATH sogar in diesem erzeugten Prozess – Oxi