RomanDillerNsk
@RomanDillerNsk
JavaScript

Как запустить и остановить .sh файл через nodejs?

Коллеги доброго времени суток, собственно вопрос в теме.

Вот код:
const { exec, spawn } = require('child_process');
    
    this.start_comand = `./testApp/headless.sh`

    this.process = exec(this.start_comand, () => {});


Задача проста, по команде запустить и остановить выполнение сторонней программы. При запуске не могу поймать событие старта программы, но это ладно и через request можно отследить корректность запуска программы. Но вот с остановкой не очень, this.process.pid вроде возвращает pid например 23145, но если сделать netstat -tpln, то данная программа имеет pid 23147, и соответственно:

exec(`kill ${this.process.pid}`, () => {});

не срабатывает.

Если кто-то делал подобное подскажите, что не так делаю? Заранее благодарю
  • Вопрос задан
  • 426 просмотров
Пригласить эксперта
Ответы на вопрос 4
megafax
@megafax
web-программист
Ответ написан
Комментировать
@timokins
exec вызывает Вашу программу через вызов оболочки,
сначала он вызывает оболочку в которой уже вызывается введенная команда, т.е. Ваша программа.

Соответственно, возвращаемый PID принадлежит не программе, а оболочке.

Если Вы хотите вызвать программу напрямую без вызова оболочки, то используйте execFile.
----
Или используйте spawn, как посоветовали выше.
Ответ написан
Комментировать
RomanDillerNsk
@RomanDillerNsk Автор вопроса
JavaScript
Товарищи, доброго времени суток, все варианты перепробовал, но вот что получается, все методы exec, execFile. spawn возвращают PID 5029 например, но если вывести netstat -tpln получается порт 5031. Мистика какая-то!!! Вот код, может я туплю:

// this.process = exec(this.start_comand, () => {});
            this.process = execFile('sh', ['./testApp/headless.sh', '- port 35000'], () => {});
            // this.process = spawn('sh', ['./testApp/headless.sh', '- port 35000']);

           console.log(this.process.pid);


с оболочкой и без один и тот же результат. Перепробовал все возможные варианты, может делаю что то не так.
Ответ написан
VariusRain
@VariusRain
музыкант-программист-конструктор
Небольшой некропост, но так как ответ до сих пор никто не дал, думаю, что кому-то может показаться полезным.
Остановка дочернего процесса осуществляется методом kill самого объекта процесса в коде.

например:
let ffmpegProcess = spawn("ffmpeg", args);
let stopRecording = function() {
    ffmpegProcess.kill();
};
setTimeout(stopRecording, 20000);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы