명령이 실행 중인지 또는 사용자 입력을 기다리는 지 어떻게 알 수 있습니까?


14

커맨드 라인에서 커맨드를 입력하고 Enter 키를 누릅니다. 아무것도 출력하지 않습니다. 실행 중이고 아직 출력되지 않았는지 또는 사용자 입력을 요청하는지 어떻게 알 수 있습니까?


기다리는 경우 PS1프롬프트 가 표시되지 않습니다 .
Prvt_Yadav 5

1. 어떤 프로그램인지 알려주십시오 (예 : 침묵). 우리는 무엇을 기대하고 점검하는 방법에 대해보다 정확한 조언을 줄 수 있습니다. ? 2.겠습니까 당신은 프로그램이 마지막으로 입력을 요청하거나 뭔가 터미널 창에 기록되도록 (완료되면, 경고를 얻을 좋아
sudodus을

입력이 예상되는 경우 입력 요청 메시지가 표시되는 것으로 가정합니다.
Rinzwind

5
@Rinzwind-그것은 나쁜 가정입니다. 명심해야 할 첫 번째 반례는 cat명령입니다. 그냥 입력 cat자체와는 표준 입력에서 입력을 기다리는 있지만 프롬프트가 제공되지 않습니다. 많은 다른 명령은 stdin 또는 파일로부터의 입력을 기대하지만 다른 입력 소스 (대화식 터미널, 파이프, 파일 ...)를 구별하지 않기 때문에 비슷하게 동작합니다.
Dave Sherohman 's

답변:


15

몇 가지 접근 방식이 있습니다.

  1. 입력 종료 신호를 보내십시오 . 할 수있는 일은 Ctrl+ 를 누르는 것입니다 d. 표준 모드의 터미널 및 유틸리티는 read()이 키 조합에 바인딩 된 EOT 신호를 수신 하면 사용 가능한 모든 텍스트를 syscall에 전송합니다. 입력이 없으면 read()대부분의 유틸리티가 종료 신호로 받아들이는 음수 종료 상태를 반환합니다. 따라서 유틸리티가 입력 대기중인 경우 키 조합을 수신하면 종료됩니다. 그렇지 않으면 유틸리티가 태스크를 실행 중이거나 올바르게 작성되지 않았습니다.

  2. syscalls 감시 : 수퍼 유저 권한이있는 경우 strace다른 터미널에서 실행 하여 현재 수행중인 작업을 볼 수 있습니다 . 이를 위해 프로그램의 PID를 찾아야합니다. 예를 들어, 다른 터미널 탭에서 예를 들어 pgrep -f firefox1234 일 수 있습니다 sudo strace -f -p 1234. 표시되는 출력이 read()syscall에 걸린 경우 명령이 입력을 기다리는 중일 수 있습니다. 그렇지 않으면 syscall이 실행되고 있으면 command가 다른 작업을 수행하는 것입니다. 장기 실행 명령이 종료되었는지 확인하려면 사용법에 대한 관련 질문 을 참조하십시오 strace.

  3. 명령 자체의 방법을 사용하십시오 : 무엇보다도 유틸리티와 같은 유틸리티 dd. 예를 들어, kill -USR1 12341234가 실행중인 dd명령의 PID 인 경우를 사용하면 현재 처리 된 바이트의 양을 stdout하도록 인쇄합니다. 물론, 이것은 처음에 그러한 명령의 행동에 대해 알아야합니다. 위의 두 가지 방법은 더 일반적이며 각 명령의 동작에 대한 깊은 지식이 필요하지 않습니다 (실제로 실행중인 것을 아는 것이 가장 좋습니다). 그렇지 않으면 명령을 실행하여 손상 될 수 있습니다.


+1. strace방법에 감사드립니다 :-) 그러나 더 간단한 방법도 유용합니다 (일반적이거나 각 프로그램마다 다릅니다). 그들 중 일부는 수퍼 유저 권한없이 작동합니다. 예 : dd무언가하고 있는지 확인하고 왜 grep --color asdf조용히 기다리고 있는지 확인하십시오 .
sudodus

@ sudodus 아, dd그 하나를 추가 할 것입니다.
Sergiy Kolodyazhnyy

사용자가 소유 한 프로세스를 디버깅하기 위해 수퍼 유저 권한이 필요하지 않습니다. 시스템 을 제대로 설정 하지 않은 경우 .
Ruslan

6

프로그램이 실행 중인지 또는 사용자 입력을 원하는지 확인하는 방법

프로그램과 호출 방법에 따라 다릅니다.

  • 프로그램이 입력을 요청한다는 메시지가 표시되는 경우가 종종 있습니다.

  • 확실하지 않은 경우 프로그램 프로세스가 사용 중인지 확인할 수 있습니다

    • CPU 사용-사용 top또는htop

    • 읽거나 씁니다-사용 sudo iotop -o

  • 그리고 프로그램이 끝나면 쉘 프롬프트가 나타납니다.

셸 스크립트 running

프로그램이 실행 중인지 확인하는 쉘 스크립트가 있었는데 이제 ...가 발견되면 (Sergiy Kolodyazhnyy의 답변에 따라) 프로그램을 실행하도록 옵션 -s을 추가했습니다 sudo strace -f -p <PID>.

쉘 스크립트는

  • ps -ef 프로그램의 대부분을 찾기 위해
  • systemctl is-active --quiet 일부 프로그램을 찾기 위해
  • 그리고 당신 stracexterm창에 원하는 경우 .

    프로그램 활동을 보는 xterm데 사용 strace하려면 설치 하십시오 .

용법

$ ./running
Usage:    ./running <program-name>
          ./running <part of program name>
Examples: ./running firefox
          ./running term                     # part of program name
          ./running dbus
          ./running 'dbus-daemon --session'  # words with quotes
          ./running -v term                  # verbose output
          ./running -s term                  # strace checks activity

셸 스크립트 runningPATH쉽게 액세스하려면 디렉토리에 디렉토리를 설치할 수 있습니다 .

쉘 스크립트 코드

#!/bin/bash

# date        sign     comment
# 2019-02-14  sudodus  version 1.0

verbose=false
strace=false
if [ "$1" == "-v" ]
then
 verbose=true
 shift
fi
if [ "$1" == "-s" ]
then
 strace=true
 shift
fi

if [ $# -ne 1 ]
then
 echo "Usage:    $0 <program-name>
          $0 <part of program name>
Examples: $0 firefox
          $0 term                     # part of program name
          $0 dbus
          $0 'dbus-daemon --session'  # words with quotes
          $0 -v term                  # verbose output
          $0 -s term                  # strace checks activity"
 exit
fi

inversvid="\0033[7m"
resetvid="\0033[0m"
redback="\0033[1;37;41m"
greenback="\0033[1;37;42m"
blueback="\0033[1;37;44m"

runn=false
#tmpfil=$(mktemp)
tmpdir=$(mktemp -d)
tmpfil="$tmpdir/tmpfil"
vtfile="$tmpdir/vtfile"
vthead="$tmpdir/vthead"

# check by systemctl

systemctl is-active --quiet "$1"
if [ $? -eq 0 ]
then
 echo "systemctl is-active:"
 runn=true
fi

# check by ps

ps -ef | tr -s ' ' ' ' | cut -d ' ' -f 8- | grep "$1" | grep -vE -e "$0 *$1" -e "$0 *.* *$1" -e "grep $1" | sort -u > "$tmpfil"
#cat "$tmpfil"
if $verbose || $strace
then
 ps -ef |head -n1 > "$vthead"
 ps -ef | grep "$1" | grep -vE -e "$0 *.* *$1" -e "grep $1" | sort -u > "$vtfile"
fi

tmpstr=$(head -n1 "$tmpfil")
#echo "tmpstr=$tmpstr"
tmpess=$(grep -om1 "$1" "$tmpfil")
#echo "tmpess=$tmpess"
if [ "$tmpstr" == "$1" ] || [ "${tmpstr##*/}" == "$1" ] || [ "${1##*/}" == "${0##*/}" ] || [ "$tmpess" == "$1" ]
then
 echo "ps -ef: active:"
 runn=true
 if $verbose
 then
  cat "$vthead" "$vtfile"
 fi
elif test -s "$tmpfil"
then
 if $runn
 then
  echo "----- consider also ------------------------------------------------------------"
  if $verbose
  then
   cat "$vthead" "$vtfile"
  else
   cat "$tmpfil"
  fi
  echo "--------------------------------------------------------------------------------"
 else
  echo "----- try with: ----------------------------------------------------------------"
  if $verbose
  then
   cat "$vthead" "$vtfile"
  else
   cat "$tmpfil"
  fi
  echo "--------------------------------------------------------------------------------"
 fi
fi

if $runn
then
 echo -en "$greenback '$1"
 if [ "$tmpstr" != "$tmpess" ]
 then
  echo -n " ..."
 fi
 echo -e "' is running $resetvid"

 if $strace
 then
  which xterm
  if [ $? -eq 0 ]
  then
   pid=$(head -n1 "$vtfile" | sed 's/^ *//' | tr -s ' ' '\t' | cut -f 2)
   echo "checking pid=$pid; quit with 'ctrl + c' in the xterm window"
   xterm -title "'strace' checks '$1'" 2> /dev/null -e sudo strace -f -p $pid
  else
   echo "Please install 'xterm' for this function to work"
   exit
  fi
 fi
else
 inpath=$(which "$1")
 if [ "$inpath" == "" ]
 then
  echo -e "$redback no path found to '$1' $resetvid"
 else
  echo -e "$blueback '$1' is not running $resetvid"
 fi
fi
rm -r "$tmpdir"

데모

Lubuntu에서 터미널 창 확인 (LXTerminal은 시작 x-terminal-emulator및 사용자 지정 gnome-terminal창)

$ running -v -s term 
----- try with: ----------------------------------------------------------------
UID        PID  PPID  C STIME TTY          TIME CMD
sudodus   2087  1384  0 13:33 ?        00:00:00 x-terminal-emulator
sudodus   2108  1269  0 13:33 ?        00:00:17 /usr/lib/gnome-terminal/gnome-terminal-server
--------------------------------------------------------------------------------
 no path found to 'term' 

$ running -v -s x-terminal-emulator
ps -ef: active:
UID        PID  PPID  C STIME TTY          TIME CMD
sudodus   2087  1384  0 13:33 ?        00:00:00 x-terminal-emulator
 'x-terminal-emulator' is running 
/usr/bin/xterm
checking pid=2087; quit with 'ctrl + c' in the xterm window

훨씬 커서가 터미널 창에서와 같이 활동 한 빨리.

여기에 이미지 설명을 입력하십시오

시작 grep(에서 입력 대기 중 /dev/stdin)

$ grep -i --color 'hello'
asdf
Hello World    
Hello World

그것을 확인

$ running -s grep
ps -ef: active:
 'grep ...' is running 
/usr/bin/xterm
checking pid=14982; quit with 'ctrl + c' in the xterm window

활동이 많지 않으며 진행중인 작업을 식별 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


iotop프로세스가 사용중인 경우 CPU 사용량이 반드시 지표가 될 수는 없지만에 대한 좋은 언급입니다 . C로 작성되고 최적화 된 프로그램은 최소 CPU를 사용하고있을 수 있습니다. 파이썬으로 작성한 일부 지표는 반복되는 작업 실행을 예약하므로 CPU를 사용하여 잠시 동안 지표 메뉴를 업데이트 한 다음 거기에 앉아있을 수 있습니다.
Sergiy Kolodyazhnyy

@ SergiyKolodyazhnyy, 네, 그렇습니다. 이 strace방법이 더 좋지만 필요하지 않거나 사용하지 못할 수 있습니다.
sudodus

동의했다. 나는 그것이 우분투와 함께 사전 설치되어 있다고 생각하지 않으며, 과잉 일 수 있습니다.
Sergiy Kolodyazhnyy

1

여전히 이것이 필요한지 확실하지 않지만 여전히 유용한 정보가 있습니다. 프로그램이 출력없이 종료되는 것처럼 보이는 경우 실행하여 백그라운드에서 실행 중인지 확인할 수 있습니다.

ps -efa | grep "program_name"

건배!


1

터미널 (예 : 터미널 에뮬레이터 또는 일반적인 ssh 세션)에서 쉘을 실행중인 경우, 쉘은 거의 확실히 작업 제어를 가능하게합니다. 따라서 대부분의 경우 질문에 대한 답변을 매우 쉽게 얻을 수 있습니다.

입력 Ctrl+Z후 과정을 중단하고 bg이 프로그램이 신호에 의해 중단되었다 여부를 확인할 수 있습니다 누른 후 배경에서 계속 쉘에 빈 줄을 입력 할 수 있습니다.

프로세스가 터미널에서 읽으려고하면 즉시 SIGTTIN신호를 받고 일시 중단됩니다. 작업 제어가 사용 가능하면 시스템은 터미널에서 한 번에 하나의 프로세스 만 읽을 수 있습니다. 쉘은이를보고합니다. 그런 다음 입력 fg하여 포 그라운드에서 프로세스를 계속 한 다음 프로그램이 정상적으로 읽을 수 있도록 입력을 입력하십시오.

mp@ubuntu:~$ sleep 30 # a program that is not reading from the terminal
^Z
[1]+  Stopped                 sleep 30
mp@ubuntu:~$ bg
[1]+ sleep 30 &
mp@ubuntu:~$ 
mp@ubuntu:~$ 


mp@ubuntu:~$ cat - # a program that is reading from the terminal
^Z
[1]+  Stopped                 cat -
mp@ubuntu:~$ bg
[1]+ cat - &
mp@ubuntu:~$ 
[1]+  Stopped                 cat -
mp@ubuntu:~$ jobs -l
[1]+  3503 Stopped (tty input)     cat -
mp@ubuntu:~$ fg
cat -
hi
hi

편집기와 같은 일부 프로그램은 Ctrl+Z제어 문자가 신호를 생성하지 않는 모드로 터미널에서 생성 된 신호를 트랩하거나 무시합니다 . 당신은 사용이 경우 고급 기술을 사용해야합니다 strace프로세스가 수행되어 있는지 read, select, poll, 등

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.