PHYSPROG

【Linux初級】Linuxの基礎とコマンドライン


そもそもLinuxとは?

f:id:physprog:20210323094958j:plain

LinuxはOSの一種

Linuxはコンピューターを動かすための基本ソフト(OS)です。

OSには以下のようなものがあります。

中でもLinuxはサーバーや、組み込みプログラムなどの多くの用途に用いられています。


Linuxは有料のUnixから作られた

Linuxの歴史についても軽く見てみましょう。

大まかな流れを下に示します。

LinuxUnixを真似て作られたソフトで、有料のUnixが無料のLinuxとして使えています。


Linuxの欠点:Officeや編集が苦手

Linuxは幅広い用途(特にサーバー)で用いられている高品質なソフトです。

しかしLinuxにもいくつかの欠点が存在します。

  • Microsoft Officeが使えない
  • 基本的に英語
  • 音楽や映像の処理が苦手

とはいえ普段使いでLinuxを使っている人はあまりいない(はず)なので、あまり問題は無さそうです。


Linuxの基礎用語

f:id:physprog:20210323095555j:plain

Linuxカーネルとは

Linuxは核となるカーネルと様々なソフトウェアを組み合わせて作られています。

カーネル単体では非常に使いにくいため、それを補う形でソフトウェアが働いています。

言い換えればLinuxカーネルLinuxの核となるソフトウェア なのですね。狭義の意味でカーネルLinuxを指す場合もあります。


ディストリビューションとは

カーネルとソフトウェアをまとめたものをディストリビューションと呼びます。

種類はたくさんありますが、大きく分類すると次の2つの種類があります。

  1. Red Hat系:CentOS,Fedoraなど
  2. Debian系:Ubuntuなど

普通Linuxと呼ぶ場合はCentOSとかのディストリビューションを指します。ちなみに僕はUbuntuを学部生の時に使っていました。


シェルとは

シェルはLinuxCLI(仲介)を担当するソフトウェアです。

詳しくシェルの役割をみてみましょう。

  1. キーボードからコマンド入力を受け付け、それをカーネルに渡す
  2. カーネルから送られてきた結果を受け取り、文字列として表示する

つまりシェルはカーネルとユーザーの仲介役をしているのですね。ドラえもんでいう翻訳コンニャクみたいなものでしょうか(?)。


シェルの画面

ここから余談です。シェルの画面では

[physprog@local ~] $

のような画面が出てきます。これは

[ユーザー名@ホスト名 ~] プロンプト

とみなします。

ユーザー名はPCにログインしているユーザーの名前、ホスト名はPCの名前を示します。

$で表されるプロンプトは「コマンド待ってます」の表示だと思えばOKです。


ターミナルとシェルは別物 

コマンドを打つ場合はターミナルから打ち込みます。ただしターミナルとシェルは役割が違うということに注意しましょう。

それぞれの役割は次のようになります。

  • ターミナル:画面出力を担当するソフトウェア
  • シェル:コマンド解釈を担当するソフトウェア

要はターミナル内でシェルを動かしてコマンドを操作する!ってわけです。コマンドを打ち込む(カッコいい)黒い画面は、あくまでターミナルが準備してくれた画面なんですね。


シェルの種類

シェルにも種類があります。あまり詳しくないので詳細は省きますが、次のようなものがあります。

  • sh:もっとも古いシェル。全てのUnixで使える。
  • bashLinux標準搭載。shを改良して作られている。
  • zsh:機能豊富でカスタマイズされている

Linuxを学ぶ場合は基本的にbashを使っておけば大丈夫のようです。


Linuxディレクトリを操作する

f:id:physprog:20210323152837p:plain

ディレクトリとは

Linuxのデータはファイルとして保存されます。例えばソフトの核の部分の重要なデータも全部ファイルで格納されています。

そして、そのファイルをしまう場所をディレクトと呼びます。WindowsMacでいうフォルダのようなものです。


ディレクトリの構造

Linuxディレクトリは階層構造です。階層構造では、中心からだんだんフォルダがどんどん増えていきます。

  • 「それって枝分かれした木の構造みたいなやつ?」

と思われた方は大正解。先人がまさに同じ思いでディレクトリーツリーと呼びました。(ちなみに僕はあまり納得していません)

そしてLinuxでは / ディレクトリが根っこに対応します。これをルートディレクトリと呼びます。


Windowsとの違い

実はWindowsでもこうした階層構造はみられますが、Linuxとの違いはルートディレクトリが複数あることです。

具体的には、

のように、Windowsではドライブから階層構造が始まるのに対して、Linuxでは / ディレクトからしか階層構造が始まりません。

 

コマンドライン

ここからディレクトリに関するコマンドを実際に見ていきましょう。

cdコマンド:ディレクトリの移動
[physprog@localhost ~]cd Desktop

cdでディレクトリを変えることができます。

特殊なコマンドもあります。

#現在のディレクトリを指定 : 
[physprog@localhost ~]cd .

#一つ上のディレクトリを指定 : 
[physprog@localhost ~]cd ..

#ホームディレクトリに移動
[physprog@localhost ~]cd ~

#ルートディレクトリに移動
[physprog@localhost ~]cd /


pwdコマンド:ディレクトリの確認
[physprog@localhost ~/Desktop]pwd

出力結果:

~/Desktop

pwdコマンドで現在のディレクトリが確認できます。


lsコマンド:ディレクトリ内のファイルの確認

lsコマンドは現在のディレクトリにあるファイルを表示できます。例えばルートディレクトリを確認すると次のようになります。

[physprog@localhost /]ls

出力結果:

bin  dev  etc  home  ...

ここには主要なディレクトリのみを示しました。

それぞれの役割は

  • bin : Linuxの動作に必要なコマンドの実行ファイルを格納
  • dev : ハードウェアの操作をするファイルを格納
  • etc : アプリやLinuxの設定ファイルを格納
  • home : 個人用のディレクト

です。基本的に操作するのはhomeディレクトです。


他にも次のようなディレクトリが存在します。

sbin  tmp  usr  var 
  • sbin : 実行ファイルを格納(ただし管理者限定)
  • tmp : アプリの結果などを一時的に格納
  • usr : アプリに付随する関連ファイルを格納
  • var : アプリのログなどの変動するデータを格納

特にtmpディレクトは定期的に削除されるので大事なファイルは置かないようにしましょう。


そしてlsコマンドには様々なオプションが存在します。

  • 複数ファイルの表示 : *, ?
# txtファイルの一覧  
[physprog@localhost ~/Documents]ls *.txt

# tから始まる4文字のファイルを表示
[physprog@localhost ~/Documents] $ ls t???

*は任意の文字列を、 ?は任意の1文字を表します。

  • ファイルの詳細をみる : -l
[physprog@localhost ~]ls -l
  • 隠しファイルを含めて表示 : -a
[physprog@localhost ~]ls -a
  • ファイルの種別を表示 : -F
[physprog@localhost ~]ls -F


ディレクトリの作成・削除

ディレクトリの作成・削除は次のコマンドで行います。

# workディレクトリの作成
[physprog@localhost ~]mkdir work

#深いディレクトリの作成(-pオプション)
[physprog@localhost ~]mkdir -p work/test
# workディレクトリの削除
[physprog@localhost ~]rmdir work

rmdirコマンドは空のディレクトを削除できます。中に何か残っている場合はエラーになります。

ファイルの中に隠しファイルなどの大切な情報を削除しないため、ディレクトリの安全な削除コマンドです。


コマンドの検索・マニュアル

コマンドの使い方が分からないときはググるよりも確実で丁寧な方法があります。

それがhelpオプションとmanコマンドです。

  • --help オプション: コマンドの説明(簡易)
  • manコマンド : コマンドの説明(詳細)
# ls のヘルプをみる
[physprog@localhost ~]ls --help

# ls のマニュアルを読む
[physprog@localhost ~] $ man ls 

# lsでキーワード検索(-k オプション)
[physprog@localhost ~] $ man -k ls 

manの-kオプションでは、キーワードが含まれているコマンドを調べることができます。

それっぽいのがあればmanや--helpで詳細を確認するのが良い使い道です。


Linuxのファイルを操作する

f:id:physprog:20210324102542j:plain

ファイルの種類

Linixにおいて重要なファイルは2種類あります。

  1. テキストファイル:文字コードで決められた文字だけが並んだデータファイル
  2. バイナリファイル:文字コード以外の数値が入っているファイル

コンピュータでは文字を数字の並びで表現しています。この文字の並びが文字コードです。

バイナリファイルは文字コード以外も含んでいるため、catやlessで見ようとすると文字化けします。


コマンドライン

catコマンド:ファイルの中をみる
# test1.txtの内容をみる
[physprog@localhost ~/Documents] $ cat test1.txt  

catでファイルの内容をみることができます。catコマンドは長いファイルをみる場合には適していません。長いと画面に収まり切らずドコダヨ!クソッ!となる場合があります。


catのオプションは次のようなものがあります。

#行番号の表示 (-nオプション): 
[physprog@localhost Documents] $ cat -n test1.txt 

#複数のファイルを表示: 
[physprog@localhost Documents] $ test1.txt test2.txt

-nオプションで行番号をつけることができます。

また複数のファイルを同時にみる場合は、半角スペースを空けて指定します。この場合は空行なしで表示されます。


lessコマンド:ファイルの中をみる

長いファイルをみる場合はlessコマンドを使います。

# test1.txtの内容をみる
[physprog@localhost ~/Documents]less test1.txt  

lessコマンドを使用する場合は画面の操作が必要になります。catではできなかったスクロール検索ができます。


画面の操作には以下のコマンドを使用します。

  • 一画面下にスクロール : スペース, f
  • 一画面上にスクロール : b
  • 一行下にスクロール : j
  • 一行上にスクロール : k
  • 終了: q


検索機能は以下のコマンドを使用します。

  • 下方向に検索 : /<文字列>
  • 上方向に検索 : ?<文字列>
  • 次の検索結果に移動 : n
  • 前の検索結果に移動 : N


touchコマンド : 空のファイルを作成する
# test3.txtを作成する
[physprog@localhost ~/Documents]touch test3.txt  

# 複数のファイルを作成する
[physprog@localhost ~/Documents]touch test3.txt test4.txt

touchコマンドで空のファイルが作成できます。複数のファイルを作成する場合は半角スペースを空けて指定します。

touchコマンドは上書きはしません。そのため安全にファイルの作成ができます。


rmコマンド : ファイルやディレクトリを作成する
# test3.txtを削除する
[physprog@localhost ~/Documents]rm test3.txt  

# 複数のファイルを削除する
[physprog@localhost ~/Documents]rm test3.txt test4.txt

# .txtを全て削除する
[physprog@localhost ~/Documents]rm *.txt

# testが付いているファイルを全て削除する
[physprog@localhost ~/Documents]rm test*

rmコマンドでファイルの削除ができます。

複数のファイルを削除する場合は半角スペースを空けて指定します。また、*や?をつけることでファイルの一部のみを指定することができます。

rmコマンドで消したファイルは完全に消去されます。そのためrmで消したデータは元に戻せないことに注意が必要です。


rmコマンドのオプションを示します。

# ディレクトリの削除(-rオプション)
[physprog@localhost ~/Documents]rm -r dir1

# 警告文を表示しない(-fオプション)
[physprog@localhost ~/Documents]rm -f test3.txt 

# 削除前に確認する(-iオプション)
[physprog@localhost ~/Documents]rm -i test3.txt 

ディレクトリを削除する際には-rオプションが必要です。ちなみにディレクトリを消去すると中のファイルは全て消去されます。

警告文が出て面倒な場合は-fオプション、慎重に削除したい場合には-iオプションを使います。


mvコマンド : 移動・名前変更
# ファイルtest.txtをディレクトリ/dir1に移動
[physprog@localhost ~/Documents]mv test.txt ~/dir1  

# ファイルtest.txtをtest1.txtに名称変更
[physprog@localhost ~/Documents] $ mv test.txt test1.txt 

# ディレクトリdir1をdir2に名称変更
[physprog@localhost ~/Documents]mv dir1 dir2

mvコマンドではファイルやディレクトリの移動に加え、名称変更もできます。

ファイルかディレクトリかの判断はPC側でやってくれるため、こちらで指定する必要はありません。


mvコマンドにはオプションが存在します。

# 上書き前に確認(-iオプション)
[physprog@localhost ~/Documents]mv -i test.txt test1.txt  

-iオプションをつけることで上書きの恐れがある場合に警告文を出してくれます。

慎重に名称変更を行いたい場合には-iオプションをつけると安全です。


cpコマンド : ファイルのコピーをする
# test.txtをtest1.txtにコピー
[physprog@localhost ~/Documents] $ cp test.txt test1.txt  

# test.txtを/fileディレクトリにコピー
[physprog@localhost ~/Documents] $ cp test.txt  file

cpコマンドではファイルやディレクトリのコピーができます。ただしcpコマンドでは上書きするため注意が必要です。

安全に使いたい場合や、ディレクトリのコピーには以下のオプションを使います。

# 上書き前に確認(-iオプション)
[physprog@localhost ~/Documents] $ cp -i test.txt test1.txt  

# ディレクトリのコピー(-rオプション)
[physprog@localhost ~/Documents] $ cp -r dir dir1  


lnコマンド : リンクの作成

リンクは初めて聞く人も多いのではないでしょうか。ゼルダの伝説では無いです。リンクには大きく分けて2種類あります。

  1. ハードリンク:対象に別名をつける。アダ名のようなもの。
  2. シンボリックリンク:対象のパスを示すリンク。


リンクはWindowsでいうショートカットのようなものです。主にパスが長くて示すのが面倒なときに使われます。違いは次のようになります。


リンクを張るときは次のようにします。

# ハードリンク
[physprog@localhost ~/Documents] $ ln file1 file2  

# シンボリックリンク(-sオプション)
[physprog@localhost ~/Documents] $ ln -s file1 file3  

ハードリンクは制約が多くて使いにくい場面があります。そのため迷ったらシンボリックリンクを使うようにしましょう。


findコマンド : ファイルの検索

findコマンドは主にファイルのパスを見つけるために使います。使い方は次のようになります。

# findの使い方
[physprog@localhost ~/Documents]find <検索開始ディレクトリ><検索条件><アクション(省略可)>

今までのコマンドよりも多くの指定を行う必要がありますが、非常に便利なコマンドです。


findは複雑に見えますが、どこにあるかを探すためには、検索条件さえ覚えればOKです。検索条件には次のようなものがあります。

  • -name : ファイル名でファイルを検索(大文字小文字を区別する)
  • -iname : ファイル名でファイルを検索(大文字小文字を区別しない)
  • -type f : 通常ファイルを検索
  • -type l : シンボリックリンクを検索
  • -type d : ディレクトリを検索
  • -a : 複数の検索条件の指定(省略可能)


使い方の例は次のようになります。

  • ファイル名で検索
#Documents内のTEST.txtという名前のファイルを探す

#-nameでは大文字小文字を区別する
[physprog@localhost ~/Documents]find  ~/Documents/ -name TEST.txt

#-inameでは大文字小文字を区別しない
[physprog@localhost ~/Documents] $ find  ~/Documents/ -name TEST.txt 

#.は現在のディレクトリを示すことができる
[physprog@localhost ~/Documents]find  . -name TEST.txt    

#*, ?を使う場合は" "で囲む
[physprog@localhost ~/Documents]find  . -name "*TEST*"    

-nameなどを使って名前で条件を絞りました。

下から2番目のコマンドでは「.」を使っています。現在のディレクトリを示す場合に.を使って表すと便利です。

また、これまでと同様に *(任意の文字列), ?(任意の一文字)などのワイルドカード が使えます。ワイルドカードを使う場合は" "で囲うように注意しましょう。


  • ファイルの種類で検索
#Documents内のディレクトリを探す
[physprog@localhost ~/Documents]find  ~/Documents/ -type d 

#/lib/ディレクトリの"bin"とつくディレクトリを探す
[physprog@localhost ~/Documents] $ find  /lib/ -type d -a -name bin 

二つ目のコマンドはディレクトリと名前の両方で指定しました。複数の条件がある場合は-aコマンドをつけますが、-aコマンドは省略してもOKです。


余談です。パスが欲しい場合は末尾に-printオプションをつけます。

#-printはパスを返す検索オプション
[physprog@localhost ~/Documents]find  ~/Documents/ -type d -print

ただし-printは省略可能です。省略した場合はパスが返ってくるため、特に-printをつける必要はありません。

標準入出力

f:id:physprog:20210325105553j:plain

標準入出力を理解する

標準入力・標準出力とは

PCにデータを渡すことを入力、逆に外にデータを出すことを出力とよびます。Linuxでは入出力をする場所を指定できます。

入出力を指定しない場合は

  • 入力:キーボード
  • 出力:ディスプレイ

がデフォルトになっています。これらを標準出力標準入力とよびます。すでに標準入出力を使っていたのですね。


エラー出力は別に定義されている

実は出力は1種類ではなく2種類あります。

  • 通常の出力
  • エラー出力

エラーだけを別に見たい!という場合に備えて、Linuxに搭載されている機能をエラー出力とよびます。

これはエラーメッセージだけを出力するもので、標準エラー出力としてディスプレイが通常は使われます。


標準入出力は3つの要素でできている

ここまで以下の3つが出てきました。

  1. 標準入力
  2. 標準出力
  3. 標準エラー出力

これら3つを合わせて標準入出力とよびます。以降で学ぶコマンドを操作する上で、これらの要素の区別が大切になってきます。


リダイレクト >:入出力を操作できる

入出力リダイレクト

リダイレクトは入出力先を変更する機能です。ファイルからの入力・出力が可能になります。

リダイレクトは >, < で行います。

  • 入力のリダイレクト : <
  • 出力のリダイレクト : >

具体例を見てみましょう。

# /Documents/testファイルをcatでみる
[physprog@localhost ~] $ cat <  /Documents/test

# lsの結果をoutput.txtに出力する
[physprog@localhost ~]ls > output.txt

ただし>は結果が上書きされてしまうので注意が必要です。

計算結果をファイルに保存してぇ!!っていう場合に重宝します。いちいちプログラム内でファイルを指定しなくて済んじゃいます。めちゃ便利です。


エラー出力リダイレクト

エラーメッセージの出力をリダイレクトする場合は次のようにします。

# エラーメッセージを2>を使ってoutput.txtに出力する
[physprog@localhost ~]ls /emp 2> output.txt

上の例では存在しない/empディレクトリにlsでアクセスしており、エラーメッセージが出ます。こうしたエラー文を出力する際は識別子2をつけて「2>」とします。

ちなみに通常の出力では1が識別子になっていますが、これは省略可能です。


便利なリダイレクト

リダイレクトには便利な指定方法があります。

# 出力とエラー出力をまとめる(2>&1)
[physprog@localhost ~]ls /Documents /emp > output.txt 2>&1

# 結果の追記(>>)
[physprog@localhost ~]echo Hello >>  output.txt

エラー出力と通常の出力をまとめる場合は&を使って識別子を書きます。

また二つ目の例のように、>>を使って追記することができます。これはいつもお世話になっています。アリガタヤ~


/dev/null の使い方

リダイレクトの番外編として、/dev/nullの活用があります。/dev/nullは、何も入出力をしない特別なファイルです。

# 入力先にしても何も結果がない
[physprog@localhost ~] $ cat < /dev/null  

# 出力しても何も表示されない
[physprog@localhost ~]ls > /dev/null

使い道あるんかい!となってしまうファイルですが、使い道としては

  • (入力先として)コマンドの確認
  • (出力先として)処理を早めるため結果を非表示にする

などが挙げられます。

特にキャッシュの削除などを行う場合に出力先として有効です。


パイプライン | :複雑な操作ができる

コマンドで出力した結果を、他のコマンドの入力として渡す場合にパイプラインを使います。

例えば

  • lsの結果をみたいけど、長いからlessでスクロールして見たいなぁ
  • lsの結果を絞り込んで、それをlessで見たいなぁ

という場合があります。この場合はコマンド同士を | で繋げます。

具体例を見てみましょう。

# lsの結果をlessでみる
[physprog@localhost ~]ls /bin | less

# lsの結果を"system"で絞り込み、それをlessでみる
[physprog@localhost ~]ls /bin | grep system | less

上の例ではパイプラインを使って、lsの結果をlessに渡しています。パイプラインは複数のコマンドでも繋げることができます。

また2つ目の例ではgrepコマンドを使っています。grepコマンドは指定した文字列で検索ができ、結果を絞る際に使える便利なコマンドです。


パーミッションのしくみ

f:id:physprog:20210325124113j:plain

オーナーとグループ

Linuxではユーザーごとにアカウントを発行します。そのため、誰がどのデータにどのようにアクセスできるかを指定しなくてはなりません。

こうしたユーザーごとの管理を行うためにパーミッションが設定されています。やべぇ...他の人のデータ全部消しちゃった...なんてことを防げます。


ファイルのオーナーとグループ

Linuxの全てのデータはファイルとして管理されています。

実はそれら全てのファイルやディレクトリにオーナーとグループが割り当てられています。役割は次の通りです。

  • オーナー:ファイルの所有者
  • グループ:複数のユーザーをまとめて、権限を一括管理する

個人以外でも、〇〇グループで分けられるのは便利ですよね。


オーナーとグループを確認する

ファイルのオーナーとグループを調べるには ls -l コマンドを使います。

# オーナーとグループを確認する(ls -lコマンド)
[physprog@localhost /] $ ls -l /etc/less

出力結果の例は次のようになります。

# 出力結果
-rwxr-xr-x. 1 root root 158240 731 2015 /bin/less

# 左から2,3番目がそれぞれオーナーとグループを示している
-rwxr-xr-x. 1 [オーナー] [グループ] 158240 731 2015 /bin/less

この例では /etc/less ディレクトリの権限を確認しています。オーナー、グループ共にrootになっていますね。


パーミッションの確認方法

ユーザーがどんな権限を持っているかを調べるには、パーミッションを読む必要があります。

パーミッションは、ls -lコマンドで表示した一番左側に書かれています。

# 一番左がパーミッション
-rwxr-xr-x. 1 root root 158240 731 2015 /bin/less

記号の意味は次のようになります。

  • r 読み取り
  • w : 書き込み
  • x : 実行


パーミッション3つずつの区切りで読みます。順番はオーナー、グループ、その他のユーザーです。

# 一番左がパーミッション
-rwxr-xr-x. 1 root root 158240 731 2015 /bin/less

# 読むときは3つずつの区切りにする
rwx | r-x | r-x

# 対応
オーナー | グループ | その他

ハイフンは無効を意味しています。許可されていません!ということですね。


それでは先ほどの例を解読してみましょう。

-rwxr-xr-x. 1 root root 158240 731 2015 /bin/less
対象 読み取り 書き込み 実行
オーナー
グループ ×
その他 ×


ファイルモードを変更する

相対指定

ファイルの権限を変更するにはchmodコマンドを使います。

書き方は次のようになります。

chmod [] [どうする] [rwx] <ファイル名>

「誰」に入る記号は次のようになります。

  • u : 所有者
  • g : グループ
  • o : その他
  • a : 全ユーザー

「どうする」に入る記号は次のようになります。

  • + :追加
  • - : 削除
  • = : 記述した権限

あとは読み書き実行のいずれかを表すrwxを書きます。これを相対指定と言います。具体例をみてみましょう。

# fileの所有者に実行の権限を与える
$ chmod u+x  file

# その他のユーザーから書き込みの権限を削除する
$ chmod o-w  file


絶対指定

他にも2進数を使った指定もあります。これを絶対指定とよびます。

絶対指定では数字を使います。

  • r : 4
  • w : 2
  • x : 1

これらのうち該当するものを足し合わせて、オーナー・グループ・その他の順で割り振ります。

具体例を以下に示します。

# 所有者:すべて与える
# グループ:読み取りのみ
# その他:何もできない
$ chmod 740 file


rootユーザーとして操作する

Linuxではシステムに関する作業はrootユーザーしか許可されていません。

何かシステムに関するソフトをインストールする場合などはsudoコマンドを使います。

$ sudo <コマンド>

sudoはrootユーザーとしてコマンドを実行できる機能です。それゆえ慎重に扱うようにしましょう。


プロセス・ジョブの管理

f:id:physprog:20210408144447j:plain

プロセスとは

プロセスは実行中の一つのプログラムのことです。コマンドを実行すると実行ファイルがメモリに格納されて、メモリ上でCPUがプログラムを実行します。

ここで大事なことはコマンドを一つ実行すると、新しいプロセスができるということです。たとえ同じコマンドを入力しても、別のプロセスになります。


psコマンド:プロセスの表示

実行中のプロセスを表示させるときはpsコマンドを使います。

オプションは主に以下のものを使います。

  • a : 全てのユーザーのプロセス
  • u : 詳細情報の表示
  • x : psコマンドを実行したユーザーの全てのプロセス

具体例をみてみましょう。

# 自分の全てのプロセスを詳細にみる
$  ps ux 

auxはオプションですが -(ハイフン)は不要です。どうやらハイフンをつけると別バーションの指定になる(?)そうです。自分はつけていません。


ジョブとは

ジョブはプロセスの集まりのことです。

例えば以下の3つのコマンドをパイプで繋げる場合を考えてみましょう。

$  ps aux | grep bash | less

この場合はプロセスが3つ生成されます。対して、この3つのプロセスの集まりがジョブになります。


プロセスとジョブの違い

プロセスとジョブの違いは管理のされかたです。

  • プロセス:OSが管理する
  • ジョブ:シェルが管理する

プロセスはOS全体で一括して管理させています。自分以外のユーザーが実行しているコマンドもOSがまとめて管理しています。

一方でジョブは、そのジョブを実行しているシェルが管理します。ジョブは自分のシェルでしか操作ができません。


バックグラウンドとフォアグラウンド

コマンドには2種類の実行方法があります。

  1. フォアグラウンド:シェルの画面内でコマンドを実行する
  2. バックグラウンド:シェルの画面外でコマンドを実行する

基本的に時間のかからない操作はフォアグラウンドで実行します。一方で、膨大な計算や時間のかかる操作をする場合はバックグラウンドで実行することが多いです。

実行中に他の操作をしたい場合はバックグラウンド、それ以外はフォアグラウンドでOKです。


jobs, fg, bgコマンド:ジョブの状態を確認する

現在のジョブを確認するにはjobsコマンドを使います。

#現在のジョブを確認する
$  jobs 

#ジョブID、進行状況、コマンドが表示される
[1]+ 実行中 <実行中のコマンド>

このようにしてジョブを表示させると、それぞれのジョブに対してIDが割り当てられていることがわかります。


コマンドをバックグラウンドで実行するにはコマンドの後ろに&をつけます。

# sleep 5 をバックグラウンドで実行する
$  sleep 5 &

フォアグラウンドで実行しているコマンドを停止させるにはCtrl + zを使います。jobsコマンドで確認すると、そのジョブが停止しているはずです。

# Ctrl + z で停止させたジョブを確認する
$  jobs

# 出力結果
[1]+ 停止 <実行していたコマンド>

ジョブをフォアグラウンド・バックグラウンドに切り替える場合は、IDを指定してfg, bgコマンドを使います。

#実行中のコマンド
[1] 停止 <実行中のコマンド> #バックグラウンド
[2] 実行中 <実行中のコマンド>  #フォアグラウンド

fg %1 #[1]をフォアグラウンドにする

bg %2 #[2]をバックグラウンドにする

上の例では2つのジョブの実行を切り替えています。fgコマンドで切り替えたジョブは、直前に停止したところまで戻るのが利点です。


killコマンド:ジョブやプロセスを終了させる

フォアグラウンドとバックグラウンドで実行しているジョブは(強制)終了の仕方が異なります。

  • フォアグラウンド:Ctrl + c
  • バックグラウンド:killコマンド

特にバックグラウンドでの作業を終了させる場合にはkillコマンドが必要になります。

使い方はkillコマンドの後ろにIDを指定します。ただしジョブの場合は%をつけましょう。

$ kill %<ジョブID>
$ kill <プロセスID>

また、どうしても終了しない場合には -SIGKILLをつけます。

$ kill -SIGKILL <プロセスID>

正確にはkillコマンドの後ろには<シグナル名>を指定します。ここでいう-SIGKILLですね。

  • kill -<シグナル名> <プロセスID>

しかし、シグナル名を省略した場合はデフォルトで「消去」を表すTERMシグナルが指定されます。なので、普通に終了したい場合はシグナル名を省略してOKです。

固まってるけどどうしても消去したい!という場合には-SIGKILLを指定しますが、PCに負荷がかかるため、-SIGKILLはなるべく使用しないようにしましょう。

/* 記事一覧のスマホ用調整 */ /* コードをダブルクリックで選択 */ /* 言語名表示 */