CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさんこんにちは。株式会社パイプラインの濱田です。前回はLinuxのプロセスを表示する ps コマンドについて取り上げました。今回は、実際に自分でプロセスを起動して ps コマンドで確認してみましょう。
今回は、2つのターミナル画面を使い、1つの画面ではsleepコマンドを実行し、2つめの画面ではpsコマンドを実行して動作を確認することにします。物理的なマシンに直接ログインして操作しようとするとログイン ログアウトが面倒なので、手元のパソコンやタブレットからリモートマシンにSSH接続するターミナル画面を2つ起動し、リモートマシンでそれぞれのコマンドを実行することをおすすめします。
まず、1つめのターミナルで以下コマンドを実行してみましょう。
sleep 120
上記コマンドを入力してエンターキーを押下した後2分以内に、2つめのターミナルで以下コマンドを実行します。
ps -aef | grep -E ’(^UID|sleep)’
出力されたコマンドの1行目は、psコマンドから出力される見出しになります。2行目は1つ目の画面で実行したsleepコマンドのプロセスが表示されています。3行目は2つ目の画面で実行したpsコマンドからパイプラインで渡されたgrepコマンドのプロセスが表示されています。
grepコマンドの出力結果を表示したくない場合、以下2パターンいずれかのコマンドで出力を抑止し、1つ目の画面で実行したsleepコマンドのプロセスのみを表示することができます。
ps -aef | grep -E ’(^UID|[s]leep)’
または
ps -aef | grep -E ’(^UID|sleep)’ | grep -v grep
のいずれを実行しても、psコマンドを実行した際に表示されるgrepのプロセスを除外することができます。
1つ目の画面をもう1度見てみましょう。sleepコマンド実行後、プロンプトが表示されず(コマンド入力を待ち受けず)カーソルが点滅しているかと思います。やがて(sleepコマンドを実行してから120秒後に)プロンプトが表示され、コマンド入力を受け付けることが再び可能になります。それでは、1つ目の画面で以下のコマンドを実行してみましょう。
echo $?
恐らく0と表示されるはずです。$?という特殊な変数は、直前に実行されたコマンドの終了ステータスを意味しています。タイプミスなどの理由で上記「echo $?」と1文字でも違うコマンドを実行してしまった場合、再度sleepコマンドを実行してから「echo $?」を実行してください(sleepの引数に与える秒数は短くして構いません)。
今回のsleepコマンドの実行の仕方は、sleepコマンドをフォアグラウンドプロセスとして実行した、ということになります。フォアグラウンドプロセスの対になる概念としてバックグラウンドプロセスというものもありますが、今回はこういう概念がある、ということだけ覚えていただければと思います。
次に、sleepコマンドを実行してから120秒待たずに強制終了させる方法を2通りご紹介します。まずは1つ目の画面でsleepコマンドを実行します。
sleep 120
上記コマンド実行後すぐに、Ctrlキーを押しながらCキーを押します。すると、ターミナルに
^C
と表示されてプロンプトに戻ります。それでは以下のコマンドを実行して終了ステータスを確認しましょう。
echo $?
すると、先ほど「0」と表示されていた数字が「130」に変わっていることがおわかりいただけるかと思います。一般的にプログラムが正常終了したときには、終了ステータスが0、プログラムが異常終了したときには、終了ステータスが0以外の数字となります。
次に、1つ目の画面でsleepコマンドを実行します。実行後に2つ目の画面を操作するので、引数に与える時間は長めにしてみましょう。
sleep 300
2つ目の画面で以下コマンドを実行して、1つ目の画面で実行したsleepコマンドのプロセスID (PID) を確認しましょう。
ps -aef | grep -E ’(^UID|[s]leep)’
出力結果の2行目(見出し行を除く1行目)の2列目(PIDの列)に、先ほど1つ目の画面で実行したsleepコマンドのプロセスIDが表示されています。2つ目の画面からkillコマンドを実行し、1つ目の画面で実行したsleepコマンドのプロセスを強制終了してみましょう。killコマンドの構文は以下の通りです。
kill 【先ほど確認したsleepコマンドのプロセスID】
それでは、1つ目の画面に戻ってみましょう。sleepコマンドの直後に「Killed」と表示されてプロンプトに戻っています。それでは以下のコマンドでsleepコマンドの終了ステータスを確認してみましょう。
echo $?
今回は「137」と表示されました。先ほど述べた通り、sleepコマンドは正常終了ではないので、終了ステータスは0ではありません。また、Ctrl+Cで終了したときと終了ステータスが異なっていることにも注目してみてください。
今回はsleepコマンドという、ただただターミナルを占拠するだけの実例でしたので、いまいち面白みが実感できなかったかも知れませんが、まとめると以下のことが理解できたかと思います。
今回のようにコマンドラインを実行することで、そのコマンドのプロセスはフォアグラウンドで実行されます。psコマンドなどのように、よほど高負荷でもない限り一瞬で終わるであろうことが期待できる場合は何も考えずにフォアグラウンドプロセスとして実行しても構いませんが、ファイルのバックアップなど、短時間で終わらないことが想定できる場合、フォアグラウンドプロセスとしてコマンドを実行することが不都合な場合もあるでしょう。
次回はバックグラウンドプロセスとしてコマンドを実行する方法と、バックグラウンドプロセスとして実行したコマンドを強制終了する方法、長時間かかるコマンドを実行したままターミナルを閉じる方法を取り上げます。
CTC 教育サービスではLinux をはじめ多数の研修コースが用意されています。ご自身の興味や業務の必要性にあったコースを受講してみてはいかがでしょうか。
https://www.school.ctc-g.co.jp/category/
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes