コマンドライン制御#
プロセスの終了#
SIGINT:Ctrl-CSIGQUIT:Ctrl-\SIGTERM:kill -TERM <PID>
#!/usr/bin/env python
import signal, time
def handler(signum, time):
print("\nI got a SIGINT, but I am not stopping")
signal.signal(signal.SIGINT, handler)
i = 0
while True:
time.sleep(.1)
print("\r{}".format(i), end="")
i += 1
一時停止とバックグラウンドでのプロセス実行#
SIGSTOP:Ctrl-Zfg: フォアグラウンドで実行を再開bg: バックグラウンドで実行を再開jobs: 現在のターミナルセッションで未完了のすべてのタスクをリストアップpidタスクを参照するために使用し、pgrepで pid を見つける%+タスク番号タスクを選択するために使用し、jobsはタスク番号を表示する$!直近のタスク
&:コマンドの後に使用すると、バックグラウンドで直接実行できるnohup:SIGHUPを無視するようにラップされ、ターミナルを閉じてもプログラムはバックグラウンドで実行され続けるdisown: 実行中のプログラムに対して、ターミナルを閉じても実行を続ける
ターミナルのマルチプレクサ#
tmux#
パネルとタブを使用して複数のターミナルウィンドウを分割し、複数のシェルセッションと同時に対話できるようにし、現在のターミナルセッションを分離して将来再接続できるようにします。
セッション - ワークスペース、1 つ以上のウィンドウを含む#
tmux新しいセッションを開始tmux new -s NAME指定した名前で新しいセッションを開始tmux ls現在のすべてのセッションをリストアップ<C-b> d現在のセッションを分離tmux a最後のセッションに再接続-t特定のセッションを指定
ウィンドウ - タブ、セッションを視覚的に複数の部分に分割#
<C-b> c新しいウィンドウを作成、<C-d>閉じる<C-b> NN 番目のウィンドウに移動<C-b> p前のウィンドウに切り替え<C-b> n次のウィンドウに切り替え<C-b> ,現在のウィンドウの名前を変更<C-b> w現在のすべてのウィンドウをリストアップ
パネル - 分割されたウィンドウのように、1 つの画面に複数のシェルを表示できる#
<C-b> "水平分割<C-b> %垂直分割<C-b> <方向>指定した方向のパネルに切り替え<C-b> z現在のパネルの拡大縮小<C-b> [スクリーンをスクロールバック。スペースキーを押して選択を開始し、Enter キーで選択した部分をコピー<C-b> <スペース>異なるパネルレイアウトに切り替え
追加のリーディング#
こちら は tmux のクイックスタートガイドです。また、こちらの記事 はより詳細で、screen コマンドも含まれています。おそらく、ほとんどの UNIX システムにはデフォルトで screen コマンドがインストールされているため、screen コマンドをマスターすることもおすすめです。
課後の練習#
タスク制御#
-
ps aux | grepのようなコマンドを使用してタスクの pid を取得し、その pid を使用してプロセスを終了することができます。しかし、もっと良い方法があります。ターミナルでsleep 10000というタスクを実行してください。そして、Ctrl-Zでバックグラウンドに切り替え、bgで続行します。今、pgrepを使用して pid を検索し、pkillを使用して pid を手動で入力することなくプロセスを終了してみてください。(ヒント:-afオプションを使用します)。sleep 10000 & pgrep sleep pkill -f sleep -
あるプロセスが終了した後に別のプロセスを開始したい場合、どのように実現すればよいでしょうか?この演習では、
sleep 60 &を最初に実行することにします。一つの方法は、waitコマンドを使用することです。このスリープコマンドを起動してから終了するまで待ってからlsコマンドを実行してみてください。sleep 60 & pgrep sleep | wait; lsただし、別の bash セッションで操作を行う場合、上記の方法は機能しません。なぜなら、
waitはサブプロセスにしか効果がないからです。以前に説明していなかった機能の一つは、killコマンドが成功した場合、そのステータスコードは 0 であり、それ以外の場合は非 0 です。kill -0はシグナルを送信せず、プロセスが存在しない場合には 0 以外のステータスコードを返します。pidwaitという bash 関数を作成し、pid を入力パラメータとして受け取り、そのプロセスが終了するまで待機するようにしてください。CPU パフォーマンスを浪費しないように、sleepを使用してください。pidwait() { while kill -0 $1 # プロセスが終了するまでループ do sleep 1 done ls }
ターミナルのマルチプレクサ#
tmux source-file ~/.tmux.confで設定ファイルを有効にします。
エイリアス#
dcというエイリアスを作成し、cdを誤ってdcと入力した場合でも正しく実行されるようにします。history | awk '{$1="";print substr($0,2)}' | sort | uniq -c | sort -n | tail -n 10を実行して、最もよく使用する 10 のコマンドを取得し、それらにエイリアスを作成してみてください。