コマンドライン制御#
プロセスの終了#
SIGINT
:Ctrl-C
SIGQUIT
: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-Z
fg
: フォアグラウンドで実行を再開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> N
N 番目のウィンドウに移動<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 のコマンドを取得し、それらにエイリアスを作成してみてください。