Bash Скрипт для уничтожения linux процессов, не возвращающихся на терминал - PullRequest
1 голос
/ 27 мая 2020

Я новичок в среде Linux и работаю над написанием сценариев для запуска и остановки нескольких служб (приложение nodejs объединено в исполняемые файлы с использованием модуля pkg). Я хочу остановить процессы по имени и нашел команду killall. Я пробовал эту команду индивидуально и внутри сценария bash. Проблема, с которой я столкнулся, заключается в том, что после выполнения команды kill управление не возвращается на терминал, и мне нужно использовать ctrl + c, чтобы вернуть терминал.

Вот сценарий, который я пробовал:

#!/bin/bash
# Run with command : chmod +x /root/myApp/stopserv.sh && /root/myApp/stopserv.sh

echo "Stopping Service1"
nohup killall  Service1 &>/dev/null &
echo "Stopping Service2"
nohup killall  Service2 &>/dev/null &
echo "Stopping Service3"
nohup killall  Service3 &>/dev/null &
echo "Stopping Service4"
nohup killall  Service4 &>/dev/null &

И когда я запускаю этот скрипт, я получаю ответ на терминале, как показано ниже:

root@Phantom-E03E:~/myApp# chmod +x /root/myApp/stopserv.sh && /root/myApp/stopserv.sh
Stopping Service1
Stopping Service2
Stopping Service3
Stopping Service4
root@Phantom-E03E:~/myApp# /root/myApp/startserv.sh: line 17: 29535 Terminated    nohup ./Service1 &> /dev/null
/root/myApp/startserv.sh: line 11: 29533 Terminated              nohup ./Service2-linux &> /dev/null
/root/myApp/startserv.sh: line 14: 29534 Terminated              nohup ./Service3-linux &> /dev/null
/root/myApp/startserv.sh: line 8: 29527 Terminated              nohup ./Service4-linux &> /dev/null

Я хочу проверить:

  1. Есть ли другой рекомендуемый способ остановить исполняемые файлы в linux по имени?
  2. Как вернуть управление терминалу «root@Phantom-E03E: ~ / myApp #» после запуска скрипта?

Спасибо, Пуджа

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Вы можете сделать это намного лучше. На самом деле вы можете сделать это двумя способами
1. используя механизм переднего плана-фона
2. используя systemd - управление службами (немного сложно)

используя fg / bg

Когда мы запускаем процесс с помощью оболочки (? bash), он будет взаимодействовать с нашим терминалом. Мы можем управлять этой интерактивностью с помощью

  • Control-Z (остановить, не выйти, просто приостановить)
  • Control- C (остановить, убить == выйти)
  • fg (возврат на передний план == интерактивность)
  • bg (запуск в фоновом режиме, когда он остановлен)

Вы можете использовать этот способ вручную или с помощью сценарий. Я покажу оба.
вот скриншот, как сделать вручную

enter image description here

с использованием bash

вот простой скрипт

#!/bin/bash

APP_STATE=$1;
APP_NAME=$2;

# TASKS=( cont stop );

function stop_app(){
    APP_PID=$(pidof $APP_NAME);
    kill -n 19 $APP_PID;

    if [[ $? == '0' ]]; then
        echo "$APP_NAME paused!";
    else
        echo "could not pause $APP_NAME";
    fi
}

function continue_app(){
    APP_PID=$(pidof $APP_NAME);
    kill -n 18 $APP_PID;

    if [[ $? == '0' ]]; then
       echo "$APP_NAME continued ...";
    else
        echo "could not continue $APP_NAME";
    fi
}

case $APP_STATE in
    cont )
        continue_app ;;
    stop )
        stop_app  ;;

esac

и снимок экрана для запуска этого скрипта

enter image description here

image

Note bg and fg are interfaces and you can do it in lower level using kill command by sending stop signal and continue signal which my script does it this way.

>>> kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

please notice signals 18 and 19.

image

For a simple killing a process by name use pkill command.
For a complex management please take look at /etc/systemd/system directory
And if you have a Node.js server up and running and its management use either of pm2 или systemd

0 голосов
/ 27 мая 2020

Просто вызовите скрипт, например:

<path_to_script> && exit
...