コマンドラインでコマンドを入力してEnterキーを押しました。何も出力しません。実行中でまだ出力されていないか、ユーザー入力を要求しているかどうかを確認するにはどうすればよいですか?
いくつかのアプローチがあります:
入力の終わりを通知してみてください:スーパーユーザー権限がないと、内部で何が行われているのかを知るのは困難です。できることは押すことです Ctrl+d。 標準モード の端末とユーティリティは、このキーの組み合わせにバインドされたEOT信号を受信すると、利用可能なすべてのテキストをread()
syscallに送信し、入力がない場合はread()
を返しますほとんどのユーティリティが終了するシグナルとして受け入れる負の終了ステータス。したがって、ユーティリティが入力を待機している場合、キーの組み合わせを受信すると終了します。そうでない場合、ユーティリティはタスクを実行しているか、適切に記述されていません。
syscallsのスパイ:スーパーユーザー権限がある場合は、別のターミナルでstrace
を実行して、現在何が行われているかを確認できます。そのためには、プログラムのPIDを見つける必要があります。たとえば、別のターミナルタブで_pgrep -f firefox
_を実行します。例として1234を実行し、次に_Sudo strace -f -p 1234
_を実行します。表示される出力がread()
syscallでスタックしている場合は、コマンドが入力を待っている可能性があります。そうでない場合、syscallが実行されているのを見ると、コマンドは別のことをしています。 strace
の使用法については 関連する質問 を参照して、長時間実行されているコマンドが終了したかどうかも確認してください。
コマンド独自のメソッドを使用する:とりわけ、dd
などのユーティリティはシグナルを使用します。たとえば、_kill -USR1 1234
_(1234は実行中のdd
コマンドのPID)を使用すると、現在処理されているバイト数がstdoutに出力されます。もちろん、そもそもそのようなコマンドの動作について知る必要があります。上記の2つの方法はより一般的であり、各コマンドの動作に関する深い知識は必要ありません(ただし、実際に何が実行されているかを知ることは常に最善です。
それはプログラムとそれをどのように呼び出すかに依存します。
多くの場合(常にではありませんが)、プロンプトが表示されます。これは、プログラムが入力を要求していることを示します。
不明な場合は、プログラムのプロセスがビジーかどうかを確認できます
cPUを使用-top
またはhtop
を使用
読み取りまたは書き込み-Sudo iotop -o
を使用
プログラムが終了すると、シェルのプロンプトが表示されます。
running
プログラムが実行されているかどうかを確認するシェルスクリプトがあり、...が見つかったときに-s
を実行するオプションSudo strace -f -p <PID>
(Sergiy Kolodyazhnyyの回答による)を追加しました。
シェルスクリプトは
ps -ef
大多数のプログラムを検索するにはsystemctl is-active --quiet
は、いくつかのプログラムを検索しますstrace
ウィンドウでxterm
を使用したい場合。
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
簡単にアクセスしたい場合は、シェルスクリプトrunning
をPATH
のディレクトリにインストールできます。
#!/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
アクティビティはそれほど多くなく、何が起こっているのかを特定できます。
まだこれが必要かどうかはわかりませんが、知っておくと便利なトリックです。プログラムが出力なしで終了したように見える場合は、次のコマンドを実行して、プログラムがバックグラウンドで実行されているかどうかを確認できます。
ps -efa | grep "program_name"
乾杯!
ターミナルエミュレータや一般的なsshセッションなどのターミナルでシェルを実行している場合、シェルはほぼ確実にジョブ制御を有効にしています。これにより、ほとんどの場合、質問への回答が非常に簡単になります。
タイプ Ctrl+Z プロセスを一時停止し、bg
をバックグラウンドで続行するには、シェルに空の行を入力して、プログラムがシグナルによって停止したかどうかを確認します。
プロセスが端末から読み取ろうとすると、すぐにSIGTTIN
シグナルを受け取り、中断されます。 (ジョブ制御が有効になっている場合、システムは一度に1つのプロセスのみをターミナルから読み取ることができます。)シェルはこれを報告します。次に、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
、を実行しているかどうかを確認するなど、より高度な手法を使用する必要があります。等.