nodejs: получить дочерние процессы демона и убить их
Я хочу построить приложение узла, которое позволяет мне отправлять kill -9
всем дочерним процессам одного демона.
Чтобы было ясно. У нас есть один демон на нашем сервере. С самого начала он запускает процесс общения с нашими клиентами.
Когда клиент отправляет новое задание на сервер, демон создает новый дочерний процесс.
Итак, теперь я хочу получить все дочерние процессы демона, kill -9
их, а затем перезапустите демон с systemctl restart mydaemon.service
Я искал в Google и не нашел ничего, что соответствует моей проблеме.
Что мне нужно сказать, так это то, что я хочу решить эту проблему, не зная идентификатор процесса демонов, конечно, только если это возможно.
Зачем мне это
Почему мне нужно это сделать, потому что программное обеспечение, к которому принадлежит демон, содержит ошибки. Процесс общения, о котором я упоминал выше, терпит неудачу и просто исчез. Продавец говорит, что убить все процессы можно, просто перезапустив демон, что, конечно, не так. Поэтому, поскольку продавец не может предоставить какое-либо решение для нашей проблемы, в настоящее время перезапускает службу так же, как я хочу автоматизировать ее сейчас. Убейте всех детей с помощью SIGKILL, а затем перезапустите демон.
Спасибо большое, ребята.
1 ответ
Вы можете найти все дочерние процессы (рекурсивно), используя 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}
- возвращает дерево всех дочерних процессов. Вывод выглядит так:sed 's/[^0-9]*\\([0-9]*\\).*/\\1/'
- держит толькоpids
, удаляет остальные строкиgrep -v "${process.pid}"
- удаляет текущий процесс из списка, мы не хотим его убиватьkill -9 ${pidsString} || true
- убивает дочерние процессы сSIGKILL
,
Я должен был сделать || true
так как pstree
возвращает полный список процессов, включая себя (он также порождает ps
внутри). Эти процессы уже завершены в тот момент, когда мы начинаем убивать, так что нам нужно, чтобы подавить No such process
ошибки.