Ошибка выполнения команды nodejs без полезного сообщения об ошибке
Это код для выполнения
cp.exec("cc -Wall /tmp/test.c -o /tmp/test", function(e, stdout, stderr) {
if (e) {
var errorstr = "Compilation failed with the following error
"+ e.message.toString()
client.send(errorstr)
console.log(e, stdout, stderr)
ee.prototype.removeAllListeners()
} else if (stderr.length > 0) {
client.send("Compilion finished with warnings\n"+ stderr + '\n')
client.send('compiled')
ee.prototype.emit('compiled')
} else {
client.send("Compilation successful")
ee.prototype.emit('compiled')
}
})
'client' - это аргумент аргумента обратного вызова socket.io. 'ee' является экземпляром EventEmitter
Приходя к проблеме. При запуске кода обратный вызов сообщает, что команда не выполнена. console.log(e, stdout, stderr) - это
{ [Ошибка: команда не выполнена: ] kill: false, код: false, сигнал: undefined} '' ''
/tmp/test.c является допустимым кодом C, и при проверке каталога / tmp я нахожу, что test.c является правильным, а двоичный "test" генерируется и при запуске в оболочке выполняется правильно. Так что я не понимаю, почему это отмечает неудачное выполнение. Информация об объекте ошибки также бесполезна. Был бы признателен за помощь / объяснение
1 ответ
Я немного обеспокоен выводом в консоль.
{ [Error: Command failed: ] killed: false, code: false, signal: undefined }
не выглядит как правильный объект JSON/JavaScript, особенно [Error: Command failed: ]
часть; пропущена хотя бы запятая
Предложения:
Запустите команду из командной строки и проверьте код выхода (используйте
echo $?
). Если код выхода равен!= 0, то это означает, что команда "не выполнена" (что бы это ни значило).Когда команда терпит неудачу, nodejs говорит, что поместит код выхода в
e.code
(что мне не хватает в вашем выводе...). Узнайте, что случилось с этим значением.Пытаться
if(e !== null)
вместоif(e)
, Не должно иметь значения, все же.Вместо непосредственного вызова компилятора вызовите скрипт оболочки, который перенаправляет stderr / stdout в файл (или сохраните копию, используя
cc ... |& tee /tmp/cc.log
) чтобы убедиться, что никакая часть сложной установки не проглотит важную информацию.