Wilhel

Wilhel

命令行環境

コマンドライン制御#

プロセスの終了#

  • 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 コマンドをマスターすることもおすすめです。

課後の練習#

タスク制御#

  1. ps aux | grep のようなコマンドを使用してタスクの pid を取得し、その pid を使用してプロセスを終了することができます。しかし、もっと良い方法があります。ターミナルで sleep 10000 というタスクを実行してください。そして、Ctrl-Z でバックグラウンドに切り替え、bg で続行します。今、pgrep を使用して pid を検索し、pkill を使用して pid を手動で入力することなくプロセスを終了してみてください。(ヒント: -af オプションを使用します)。

    sleep 10000 &
    pgrep sleep 
    pkill -f sleep
    
  2. あるプロセスが終了した後に別のプロセスを開始したい場合、どのように実現すればよいでしょうか?この演習では、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
    }
    

ターミナルのマルチプレクサ#

  1. この tmux チュートリアルを完了し、tmux をカスタマイズする方法については、これらの手順 を参照してください。

tmux source-file ~/.tmux.conf で設定ファイルを有効にします。

エイリアス#

  1. dc というエイリアスを作成し、cd を誤って dc と入力した場合でも正しく実行されるようにします。
  2. history | awk '{$1="";print substr($0,2)}' | sort | uniq -c | sort -n | tail -n 10 を実行して、最もよく使用する 10 のコマンドを取得し、それらにエイリアスを作成してみてください。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。