2

Я пытаюсь написать скрипт bash, который бы перезапустил мой сервер NodeJS. Вот как я запускаю экран с сервером:

screen -S web-server -d -m node web-server.js

что в итоге (это означает, что это работает):

$ ps -Af | grep node
ubuntu  19504   1       0   10:20   ?       00:00:00 SCREEN -S web-server -d -m sudo node web-server.js
root    19506   19504   0   10:20   pts/2   00:00:00 sudo node web-server.js
root    19507   19506   8   10:20   pts/2   00:00:00 node web-server.js

И вот как я пытаюсь убить этот сервер:

screen -S web-server -X quit

Который фактически заканчивается процессом зомби (ppid сервера изменяется на 1):

$ ps -Af | grep node
root    19506   1       0   10:20   ?   00:00:00 sudo node web-server.js
root    19507   19506   0   10:20   ?   00:00:00 node web-server.js

Как мне убить тот сеанс экрана, включая запущенный процесс внутри?

Для тех из вас, кто может беспокоиться - причина, по которой мне нужен sudo на экране, заключается в том, что я запускаю сервер на порту 80, для которого узлу требуются права суперпользователя.

1 ответ1

0

Так что это кажется одним из возможных решений:

screen -list | grep Detached | \
awk '{ print $1 }' | awk -F. '{ if($2=="web-server") print $1 }' | \
xargs sudo pkill -P

Если кто-нибудь придумает лучшее (более чистое) решение (вместо того, чтобы искать дочерние процессы экрана и убивать их), я буду более чем рад принять этот ответ + поднять голос.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .