2016-04-12 13 views
0

Das könnte offensichtlich sein, aber ich habe Mühe, eine Lösung zu finden.nodejs - Verzeichnis für Änderungen im Hintergrund beobachten und etwas Aktion ausführen

// watch.js 
var fs = require('fs'); 

function watch(dir, config) { 
    fs.watch(dir, { 
    persistent: true, 
    recursive: true 
    }, (event, filename) => { 
    if (filename) { 
     console.log(`filename changed: ${filename}`); 
     // do something 
    } 
    }); 
} 

module.exports = watch 

Ich möchte diese watch im Hintergrund laufen zu lassen, so etwas wie nohup, ich sah child_process.spawn aber immer noch nicht die Verwendung herauszufinden.

Gemäß der Dokumentation child_process.spawn erwartet ein command als Argument.

Jeder Zeiger, wie könnte ich es erreichen?

Ziel ist es, Verzeichnis für Änderungen im Hintergrund zu beobachten und einige Maßnahmen durchzuführen.

Danke!

+0

Was meinst du mit "im Hintergrund"? Node.js ist asynchron; Es klingt so, als ob Sie die Funktion nur aufrufen möchten. – SLaks

+0

Ähnlich wie 'nohup' erwarte ich eine' binary', die die Eingabeaufforderung im Terminal zurückgibt und das Dateisystem überwacht. – sarbbottam

+0

Dann müssen Sie einen neuen Prozess mit einer Befehlszeile ausführen. (wahrscheinlich 'node somefile.js') – SLaks

Antwort

0

Wenn Sie Spawn verwenden möchten, können Sie Ihre Uhr Prozess in ein eigenes Skript aufteilen und dann aus Ihrem Hauptskript spawnen. Dann lassen Sie das Hauptskript für die Ausgabe beobachten.

Dies ist in Anbetracht Ihrer Uhr Funktion muss nicht über irgendetwas im aufrufenden Prozess wissen.

watcher.js

var fs = require('fs'); 

function watch(dir, config) { 
    fs.watch(dir, { 
    persistent: true, 
    recursive: true 
    }, function(event, filename) { 
    if (filename) { 
     console.log("filename changed: " + filename); //to stdout 
    } 
    }); 
} 

watch('./watchme/'); //<- watching the ./watchme/ directory 

main.js

const spawn = require('child_process').spawn; 
const watch = spawn('node', ['watcher.js']); 

watch.stdout.on('data', function(data) { 
    console.log("stdout: " + data); 
}); 

watch.stderr.on('data', function(data) { 
    console.log("stderr: " + data); 
}); 

watch.on('close', function(code) { 
    console.log("child process exited with code " + code); 
}); 
+0

Wie bekomme ich den Hauptprozess zu beenden, habe ich versucht mit 'options = {detached: true, stdio: ['ignore']}' & 'watch.unref()' – sarbbottam

+0

Oh ok, also wollen Sie nur die verwenden Hauptsache, um das andere Skript zu starten. Die stdio-Option als Array hat tatsächlich 3 Elemente, die stdin, stdout, stderr sind. Du solltest also alle 3 wie folgt ignorieren: {detached: true, stdio: ['ignore', 'ignore', 'ignore']}. Sie können auch einfach einen String als Wert für die stdio-Optionen verwenden, der für alle 3 gilt: {detached: true, stdio: 'ignore'} macht dasselbe – KorreyD

+0

auch wenn Sie dann die stdout.on und stderr ignorieren .on Handler werden einen Fehler ausgeben, also sollten Sie diese entfernen, wenn Sie stdio: 'ignore' verwenden – KorreyD