簡體   English   中英

Bash 腳本終止 linux 進程未返回終端

[英]Bash Script to kill linux processes not coming back to terminal

我是 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#”?

謝謝,普加

只需像這樣調用腳本:

<path_to_script> && exit

你可以做得更好。 實際上你可以通過兩種方式做到這一點
1.使用前后台機制
2.使用systemd-服務管理(有點復雜)

使用 fg / bg

當我們使用 shell (?bash) 運行進程時,它將與我們的終端交互。 我們可以通過以下方式管理這種交互性

  • Control-Z(停止,不退出,只是暫停)
  • Control-C(停止,殺死 == 退出)
  • fg(將其帶回前台 == 交互性)
  • bg(停止時在后台運行)

您可以手動使用這種方式,也可以使用腳本。 我會展示兩者。
這是手動執行的屏幕截圖

在此處輸入圖像描述

使用 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

和運行此腳本的屏幕截圖

在此處輸入圖像描述

注意bgfg是接口,您可以使用kill命令通過發送停止信號繼續信號在較低級別執行此操作,我的腳本以這種方式執行此操作。

>>> 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    

請注意信號1819

要通過名稱簡單地殺死進程,請使用pkill命令。
對於復雜的管理,請查看/etc/systemd/system目錄
如果您有一個Node.js服務器啟動並運行並且它的管理使用pm2或 systemd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM