Jak zabić sesję ekranową za pomocą polecenia sudo?

2

Próbuję napisać skrypt bash, który ponownie uruchomiłby mój serwer NodeJS. Oto jak uruchamiam ekran z serwerem:

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

co kończy się na tym (co oznacza, że ​​działa):

$ 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

I tak próbuję zabić ten serwer:

screen -S web-server -X quit

Które faktycznie kończą w procesie zombie (ppid serwera zmienia się na 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

Jak zabić tę sesję ekranu, w tym trwający proces?

Dla tych, którzy mogą się martwić - powodem, dla którego potrzebuję sudo na ekranie, jest to, że uruchamiam serwer na porcie 80, dla którego węzeł wymaga uprawnień superużytkownika.

Radek Simko
źródło
1
Nie rozumiem tego w pełni ... Dlaczego nie zabijesz procesu zawierającego aplikację węzła (w twoim przypadku 19507) i po prostu usuniesz sesję screena?
Rob
1
Równie dobrze możesz umieścić proces serwera za zwrotnym proxy, takim jak ten, nginxktóry sam nasłuchiwałby na porcie 80 i przekazywał połączenia do twojego nodeprocesu nasłuchując na nieuprzywilejowanym porcie (lub nawet na uniksowym gnieździe itp.).
kostix
1
@Rob Cóż, mogę zrobić coś takiego jak znaleźć PID ekranu, którego nazwa to web-server w ps, a następnie przejść ponownie do ps i znaleźć wszystkie pidy, których ppid to pid ekranowy i w końcu zabić wszystkie te „Mam nadzieję, że nie stawić czoła warunkom wyścigowym na żadnym z tych etapów ... Czy to wydaje ci się dobrym pomysłem?
Radek Simko
@kostix Dobrze, że to może być rozwiązanie mojego problemu (dzięki za to), ale nie odpowiada na oryginalne pytanie. ;-)
Radek Simko
@RadekSimko Brzmi dla mnie jak dobry pomysł. Wykonaj kilka przykładowych uruchomień.
Rob

Odpowiedzi:

0

Wygląda to na jedno z możliwych rozwiązań:

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

Jeśli ktokolwiek wymyśli lepsze (bardziej czyste) rozwiązanie (zamiast szukać dziecięcych procesów screena i zabijania ich), z przyjemnością zaakceptuję tę odpowiedź + oceniam ją.

Radek Simko
źródło