Process

如何在不終止該螢幕會話的情況下終止在螢幕會話中執行的特定程序?

  • January 21, 2022

我在多個screen會話下執行了多個 ANN 培訓過程。當我進入一個螢幕時,我看到一個訓練過程正在執行。

現在,我想在不殺死螢幕的情況下殺死螢幕內的特定程序。

我可以按CTRL + C。但是,這會在螢幕上產生一些不需要的垃圾文本。

我怎樣才能乾淨地做到這一點?

如果我嘗試使用程序 ID 終止程序,我會感到困惑。對我來說,不可能辨識單個過程。因為,他們正在執行具有相同文件名的文件。

怎麼做?

注意我正在使用 TensorFlow 和 Keras。

NB#2,我正在使用 SSH。

如果您能夠 ssh 進入遠端主機(一個正在執行的螢幕),那麼您可以從一個類似的問題中修改我的腳本,我必須給您程序的 pid,然後將其殺死。

  1. 找到要在其下終止程序的視窗的編號。如果您正在查看視窗,Ctrl+a N將使其在視窗的左下角出現幾秒鐘。

**注:**即按住Ctrl,按a,鬆開Ctrl,然後大寫N 2. 如果您有多個螢幕會話正在執行,請確定您的目標是哪個會話。我不會在這裡詳細介紹,因為我假設您只執行一個會話。您可以通過在遠端主機上執行它來檢查:screen -ls 3. 執行下面修改後的腳本,傳入您在步驟 1 中找到的視窗編號。

**注意:**您必須將腳本保存到文件並使其可執行 [ chmod +x <script-name>],然後才能執行它 [ ./<script-name> <window-number>]) 4. 仔細檢查它返回的內容是否與該視窗上執行的內容相似 5. 在遠端主機上,執行kill <pid-from-first-column-that-script-returned>(用腳本返回的實際 pid 替換括號) 6. 你完成了!

修改後的腳本:

#!/bin/bash
# Accept a GNU/screen window number and return the process running in its shell. 
# It assumes that you only have 1 session. If you have multiple sessions,
# pass in session name as the second argument.
TargetTabNum=$1
SessionName=$2

if [ -z "$SessionName" ]; then
   SessionName=.*
fi

# This finds the session PID given the session name.
# The screen command prints the list of session IDs
# Example output of screen command:
#     There is a screen on:
#             29676.byobu     (12/09/2019 10:23:19 AM)        (Attached)
#     1 Socket in /run/screen/S-{username here}.
# Example output after sed command: 29676
SessionPID=$(screen -ls | sed -n "s/\s*\([0-9]*\)\.$SessionName\t.*/\1/p")

# This gets all the processes that have the session as a parent,
# loops through them checking the WINDOW environment variable for
# each until it finds the one that matches the window number, and
# then finds the process with that process as a parent and prints its
# pid, command, and arguments (or null if there are no matching processes)
ProcessArray=( $(ps -o pid --ppid $SessionPID --no-headers) )
for i in "${ProcessArray[@]}"
do
   ProcTabNum=$(tr '\0' '\n' < /proc/$i/environ | grep ^WINDOW= | cut -d '=' -f2)
   if [ ! -z "$ProcTabNum" ] && [ "$TargetTabNum" -eq "$ProcTabNum" ]; then
       ProcInTab=$(ps -o pid,args --ppid $i --no-headers)
       if [[ $? -eq 1 ]]; then
           ProcInTab=NULL
       fi
       echo $ProcInTab
       exit 0
   fi
done
echo "Couldn't find the specified Tab: $TargetTabNum" >&2
exit 1

引用自:https://unix.stackexchange.com/questions/681603