2013-04-11 8 views
26

Sto cercando di eseguire uno script tramite nodejs che fa:Come ottenere la CWD (directory di lavoro corrente) da un processo figlio nodejs (in entrambe le finestre e linuxish)

cd .. 
doSomethingThere[] 

Tuttavia, per fare questo , Ho bisogno di eseguire più processi figlio e portare lo stato di ambiente tra questi processi. Quello che mi piacerebbe fare è:

var exec = require('child_process').exec; 
var child1 = exec('cd ..', function (error, stdout, stderr) { 
    var child2 = exec('cd ..', child1.environment, function (error, stdout, stderr) { 
    }); 
}); 

o per lo meno:

var exec = require('child_process').exec; 
var child1 = exec('cd ..', function (error, stdout, stderr) { 
    var child2 = exec('cd ..', {cwd: child1.process.cwd()}, function (error, stdout, stderr) { 
    }); 
}); 

Come posso fare questo?

+3

Cerca in fibre o una delle tante librerie di thread di lavoro per nodo; risparmia un sacco di energia e approfitta delle librerie che hanno già risolto le centinaia di problemi che dovrai affrontare come questa. – Kato

+0

@ Kato I uso le fibre. Non ha letteralmente nulla a che fare con quello che sto chiedendo. Se le librerie dei thread di lavoro di cui stai parlando sono del tutto simili, non sono utili in questo caso. –

risposta

30

per iniziare bambino con dir padre come CWD:

var exec = require('child_process').exec; 
var path = require('path') 

var parentDir = path.resolve(process.cwd(), '..'); 
exec('doSomethingThere', {cwd: parentDir}, function (error, stdout, stderr) { 
    // if you also want to change current process working directory: 
    process.chdir(parentDir); 
}); 

Aggiornamento: se si desidera recuperare CWD del bambino:

var fs = require('fs'); 
var os = require('os'); 
var exec = require('child_process').exec; 

function getCWD(pid, callback) { 
    switch (os.type()) { 
    case 'Linux': 
    fs.readlink('/proc/' + pid + '/cwd', callback); break; 
    case 'Darwin': 
    exec('lsof -a -d cwd -p ' + pid + ' | tail -1 | awk \'{print $9}\'', callback); 
    break; 
    default: 
    callback('unsupported OS'); 
    } 
} 

// start your child process 
// note that you can't do like this, as you launch shell process 
// and shell's child don't change it's cwd: 
// var child1 = exec('cd .. & sleep 1 && cd .. sleep 1'); 
var child1 = exec('some process that changes cwd using chdir syscall'); 

// watch it changing cwd: 
var i = setInterval(getCWD.bind(null, child1.pid, console.log), 100); 
child1.on('exit', clearInterval.bind(null, i));  
+0

Hey Andrey, questo risolve il problema di esempio inventato che ho trovato, ma non risponde ancora alla domanda principale su come ottenere la directory di lavoro da un processo figlio. –

+0

hai bisogno del tuo processo figlio per segnalare la sua directory di lavoro? È impostato inizialmente dall'opzione 'cwd'. Se hai bisogno di sapere cos'è prima dell'uscita del bambino, mandalo da bambino tramite una chiamata RPC (il più semplice è solo per stampare su stdout) –

+0

Sto effettivamente cercando di eseguire comandi di shell arbitrari che potrebbero includere comandi che cambiano il cwd (come "CD"). –

2

Solo un pensiero, se si conosce PID del processo figlio e avere pwdx installato (probabilmente su linux), è possibile eseguire quel comando dal nodo per ottenere il cwd del figlio.

+0

+1 Suona decisamente come una risposta funzionante.Sarebbe bello se ci fosse un modo per farlo senza scherzare con le utility della linea di comando che risolvono la soluzione OSX –

+1

: 'OSX:' lsof -a -d cwd -p [pid] '. Su Linux, invece di pwdx si può semplicemente eseguire 'ls -l/proc/[pid]/cwd' (o, dal nodo:' require ('fs'). ReadlinkSync ('/ proc/123456/cwd') ') –

+0

Ottimo punto Andrey. –

19

Se si desidera ottenere la directory di lavoro corrente senza ricorrere a utilità della riga di comando specifiche del sistema operativo, è possibile utilizzare la libreria shelljs "testata in conflitto" che astratta queste cose per voi, mentre al di sotto utilizzando i processi figlio.

var sh = require("shelljs"); 
var cwd = sh.pwd(); 

Là lo avete, la CWD variabile contiene la directory di lavoro corrente se siete su Linux, Windows, o FreeBSD.

1

Penso che la soluzione migliore sia la manipolazione dello options.cwd tra le chiamate allo exec. in exec la richiamata this.pwd e this.cwd potrebbe fornire un vantaggio per le implementazioni.

Problemi correlati