コマンドライン制御#
プロセスの終了#
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
現在のすべてのウィンドウをリストアップ
パネル - vim のような画面分割で、1 つの画面に複数のシェルを表示できる#
<C-b> "
水平分割<C-b> %
垂直分割<C-b> <方向>
指定した方向のパネルに切り替え<C-b> z
現在のパネルの拡大縮小<C-b> [
スクリーンを逆方向にスクロール。スペースキーを押して選択を開始し、Enter キーで選択した部分をコピー<C-b> <スペース>
異なるパネルレイアウトに切り替え
追加の読み物#
ここ には、tmux
のクイックスタートガイドがあります。また、この記事 には、より詳細な情報が含まれており、screen
コマンドも含まれています。おそらく、お使いの UNIX システムには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
はサブプロセスにしか効果がないからです。以前に説明していなかった機能の 1 つは、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
で設定ファイルを有効にします。
エイリアス#
cd
をdc
と誤って入力した場合でも正しく実行されるようにするdc
エイリアスを作成してください。history | awk '{$1="";print substr($0,2)}' | sort | uniq -c | sort -n | tail -n 10
を実行して、最もよく使用する 10 のコマンドを取得し、それらにエイリアスを作成してみてください。