nodejs: получить дочерние процессы демона и убить их - PullRequest
0 голосов
/ 05 июня 2018

Я хочу создать приложение для узла, которое позволяет мне отправлять kill -9 всем дочерним процессам одного демона.

Для ясности.У нас есть один демон на нашем сервере.При запуске он запускает процесс для связи с нашими клиентами.

Когда клиент отправляет новое задание на сервер, демон создает новый дочерний процесс.

Так что теперь яхочу получить все дочерние процессы демона, kill -9 их и затем перезапустить демон с помощью systemctl restart mydaemon.service

Я искал в Google и не нашел ничего, что соответствует моей проблеме.

Что янужно сказать, я хочу решить эту проблему, не зная идентификатор процесса демонов, конечно, только если это возможно.

Зачем мне это нужно

Почему мне нужно это сделать, потому что,программное обеспечение, к которому принадлежит демон, содержит ошибки.Процесс общения, о котором я упоминал выше, терпит неудачу и просто исчез.Продавец говорит, что убить все процессы можно, просто перезапустив демон, чего, конечно, нет.Поэтому, поскольку продавец не может предоставить никакого решения нашей проблемы, в настоящее время перезапускает службу так же, как я хочу автоматизировать ее сейчас.Убейте всех детей с помощью SIGKILL, а затем перезапустите демон.

Большое спасибо, ребята.

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете найти все дочерние процессы (рекурсивно) с помощью утилиты pstree.Скорее всего, потребуется установить его.Например, на Mac вы должны выполнить: brew install pstree.

Затем вы можете запустить этот фрагмент, чтобы найти все дочерние процессы и убить их:

const child_process = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(child_process.exec);

(async () => {
    const pids = await execAsync(
        `pstree ${process.pid} | sed 's/[^0-9]*\\([0-9]*\\).*/\\1/' | grep -v "${process.pid}"`
    );

    // Join the pids into one line separated by space
    const pidsString = pids.stdout.replace(/[\r\n]+/g, ' ');

    await execAsync(`kill -9 ${pidsString} || true`);
})();

Подробное объяснение приведено ниже:

  • pstree ${process.pid} - возвращает дерево всех дочерних процессов.Вывод выглядит следующим образом: enter image description here

  • sed 's/[^0-9]*\\([0-9]*\\).*/\\1/' - сохраняет только pids, удаляет остальные строки

  • grep -v "${process.pid}" - удаляет текущий процесс из списка, мы не хотим его убивать

  • kill -9 ${pidsString} || true - убивает дочерние процессы с помощью SIGKILL.

Я должен был сделать || true, потому что pstree возвращает полный список процессов, включая самого себя (он также порождает ps внутри).Эти процессы уже завершены в тот момент, когда мы начинаем убивать, поэтому нам нужно, чтобы он подавлял ошибки No such process.

...