ぽれいんのブログ

エンジニアになるために覚えたことを日記に付けます。

Linuxの基本操作③

はじめに

4月からプログラミングを学んでおります。ポレインと申します。

私事ではございますが、7月からインフラエンジニアとして働くことになりました。

転職する前はプログラミングスクールにて主にHTML、CSSRubyMySQL等について学びました。

※このブログでは自分が後々、見返すことができるようにまとめることを目的としていますが、もし需要があるようでしたら是非ともご覧ください。

<前回の記事>

porain.hatenablog.com

↑↑まだ見ていない方はこちらから↑↑

<参考>

CodeZine(コードジン)

 

 

 

出力の操作

通常、コマンドの出力先は端末画面になりますが、コマンドの出力先を変更することが可能です。このコマンドの出力先、入力先を変更することを”リダイレクト”、出力を他のコマンドの入力に換えることを”パイプ”といいます。

標準入力と標準出力

”の記号(リダイレクション演算子)を使うことでリダイレクト可能です。”echo”コマンドの際にしれっと使いましたが、”echo”コマンドに限らず、どのコマンドでもリダイレクト可能です。

dmesg > bootfile      
less bootfile

上記の例では、"dmesg”コマンドの出力先をbootfileに変更しています。これにより、非常に長い出力内容である"dmesg”コマンドをlessを使い閲覧することが可能になります。

また、”>”は上書きで出力します。 ”>>”は末尾に追記して出力します。

標準エラー出力

標準エラー出力とはエラーが出た場合の出力先の通り道のことです。エラーが出た場合は標準出力とは違う道を通って画面に出力されます。しかし画面を見ただけではエラーかどうかを見分けることができません。(通り道が違うだけで出力先は同じなため

エラー出力をリダイレクトしすることで確認することができます。

エラー出力リダイレクトする場合、ファイルディスクリプタを指定します。

<ファイルディスクリプタ

標準入力        標準出力    1    エラー出力   

(A)   cat /etc/shadow etc/resolv.conf
(B) cat /etc/shadow etc/resolv.conf 2> errorfile

(A)でcatを使ってファイルを2つ同時に開きました。当然、エラーが出ます。

そこで(B)により、エラー出力のファイルディスクリプタ ”2” を指定して、エラーファイルのみをerrorfileというファイルにリダイレクトしています。

標準出力、エラー出力ともに1つのファイルにまとめて出力する場合、以下のように実行します。

cat /etc/shadow etc/resolv.conf  &> errorfile

ファイルディスクリプタを指定する代わりに"&"(アンバサンド)を記入します。

パイプ

パイプはコマンドとコマンドをつなぐ役割を担います。例えば、”ls”コマンドを実行したときにその出力結果が画面の範囲を超えるくらいに膨大な量であるとき、最初の方で出力された内容を見ることができません。しかし、パイプを使い出力結果を”less”コマンドの入力データとして取り込ませることができます。

ls -l /etc/ | less       /etcディレクトリ直下の詳細をlessで表示

検索して表示する機能(grep

ある文字列を含む行だけを抜き出して表示したいとき、”grep”コマンドを使用します。

grep ftp /etc/passwd  /etc/passwdファイルからftpを含む行を表示

この"grep”もよくパイプと共に使用されます。例えば以下のように実行すれば/etcディレクトリ直下のconfという文字列を抜粋することができます。

ls -l /etc/ | grep conf 

プロセス

プロセスとは実行中のプログラムのことを指します。

プロセス確認(ps)

シェルを含むプロセスを表示するために"ps"コマンドを使用します。"ps"コマンドではオプションとして-a -u -xをつけますが、ハイフンは省略できます。

また、画面がスクロールアウトしますのでパイプを使い”less”コマンドにつなぎます

ps aux | less

"ps aux"を実行すると、以下を知ることができます。

PID                     プロセスID。プロセスを操作する際に使用。

%CPU       CPUの占有時間率。

%MEM     実メモリ使用率。
VSZ       仮想メモリ使用量。

RSS                     実メモリ使用量。

START                プロセスの状態を示す。

 (MEMとRSSは%で表示するかどうかの違いと認識。)

プロセスの親子関係

プロセスは例外を除いて何か別のプロセスから生み出されます。
親となるプロセスから、子となるプロセスが生み出されます。(子供のプロセスは親のプロセス環境を受け継ぎます。)プロセスの親子関係を表示するには”pstree”コマンドを使います。

pstree | less

また、psコマンドとpstreeを合わせたような表示方法もあります。

(A) ps -efH
(B) ps afx | less

(A)の-efHオプションを追加するとPIDに加えてPPID(親プロセスID)を知ることができます。

(B)の-afxオプションでもツリー型でプロセスを表示してくれます。

すべてのプロセスはinitプロセスから実行されていることがpsツリーより分かります。そのため、initプロセスは必ず実行されるプロセスということでPID:1が割り当てられます。

環境変数

変数はシェル変数環境変数の2種類に分けることができます。シェル変数はシェル内のみで有効な変数、環境変数はそのプロセスの子プロセスにも有効な、すなわち引き継がれていく変数です。大きな違いとしては有効範囲の大きさですね。

環境変数の設定の手順としては①シェル変数を設定し、2シェル変数から環境変数を指定します。

(A) Porain=HUMAN
(B) export Porain
上記(A)(B)をまとめて実行することも可能
export Porain=HUMAN

現在の環境変数の一覧は”export”または”env”コマンドで確認できます。

シグナル

シグナルはプロセス間通信の一つです。プロセスが別のプロセスにシグナル(信号)を送ることによってプロセスを停止したり設定ファイルを読みこませたりできます。そのコマンドとして”kill/killall”コマンドを使用します。

kill -TERM 15370         プロセスID15370のプロセスを停止
killall TERM process   processという名前のプロセスをすべて停止
kill -KILL 15370 プロセスID15370のプロセスを強制停止

killallコマンドは同じプロセス名のものが複数あった場合すべてを一度に終了させることができるので、意図しないものも終了させてしまう危険性があります。

-KILLオプションは最終手段です。kill -TERMで終了できず、どうしようもない場合に使用します。

実際の作業ではpsコマンドとセットで使用します。

RPM

 RPMファイル

アーカイブファイルになっており1つのファイルに複数のファイルがまとめられています。RPMコマンドでインストールをおこなうことでそれぞれのファイルを適切なディレクトリに配置しています。

インストール

RPMをインストールには”rpm”コマンドに”-i”オプションを付けて実行します。

rpm -ivh <rpm ファイル>

アンインストール

rpm”コマンドに”-e”オプションを付けます。

rpm -e <パッケージ名>  引数にはインストールしたパッケージ名を指定

アップグレード

rpm”コマンドに”-U”または”-F”オプションを付けます。

パッケージがインストールされていない場合

-U   なりふり構わずインストール

-F   余計なパッケージをインストールしない

rpm -Fvh <rpmファイル>
rpm -Uvh <rpmファイル>

すでにインストール済みのパッケージをアップグレードする際は”-F”オプションを使うといいですね!!

RPMの依存関係

A → B → D → F

          C   E   J
上図のようなことを表します。

AをインストールするにはB,Cが必要、BをインストールするにはD,Eが必要、DをインストールするにはF,Jが必要といったようにいつまでたってもインストールできない!といった状態になることです。イライラしちゃいそうですね…笑

これを解決するものとしてyumがあります。(後ほど登場致します。)        インストールされたパッケージの表示

rpm”コマンドに"-q"オプションを使うことでRPMデータベースに問い合わせをすることができます。

rpm -q <パッケージ名>  パッケージのバージョン表示
rpm -qa インストールされているパッケージの全表示

パッケージのファイル群の表示

rpm -qpl <rpmファイル名>     インストールする前のrpmファイルを指定
rpm -ql<パッケージ名> インストールされたパッケージを指定

パッケージの詳細情報の表示

rpm -qpi <rpmファイル名> インストールする前のrpmファイルを指定
rpm -qi<パッケージ名> インストールされたパッケージを指定

ファイル群は"-l"オプション、詳細情報は"-i"オプションですね!!

5.yum

yumRPMパッケージを統合管理するものです。

リポジトリ

リポジトリとはパッケージの提供元(配布場所)のことです。iPhoneでいうアップルストアです!リポジトリは世界中にあり配っているパッケージが違います。yumリポジトリを追加することでパッケージのバリエーションを増やすことができるようになります。

yum

 コマンド一覧

パッケージのインストールおよび、リポジトリを指定してのインストール
yum install           
yum install -enablerepo=レポジトリ名 <パッケージ名>
アップデート
yum update
検索
yum search <パッケージ名>
削除
yum remove <パッケージ名>
詳細
yum info <パッケージ名>
インストールされているパッケージの表示
yum list installed

オプション一覧(抜粋)

-y                   全ての問い合わせにyesで答えたものとして実行する
installroot = 場所  インストール先を指定
downloaddir = 場所  ダウンロード先を指定
-v           詳しいメッセージを出力

また、cat /etc/yum.confでyumコマンドの設定ファイルをみることができます。

サービスの自動化

サービスを手動で即時に制御する方法とシステム起動時に自動的に制御する方法があります。サービスを制御する方法は様々ですがRPMYUMを利用する場合は統一されています。

システム起動時

システムの起動順番は以下のようになっております。

  1. マシンの電源
  2. BIOSプログラムの起動
  3. ブートローダ起動
  4. カーネルロード
  5. initプロセス
  6. ログイン画面

 この中でシステム起動時のサービスの自動起動に関係があるのがinitプロセスです。

initプロセス

initプロセスとはLinuxの起動時最初に実行されるプロセスです。このプロセスは設定ファイルに従って実行されます。この設定ファイルで最初に設定されるのがデフォルトランレベルです。(設定ファイル/etc/initab)

ランレベル(runlevel)

ランレベルとはLinuxシステムの動作モードを指します。

ランレベル    説明
  0 終了に移行する状態
  1 シングルユーザモード
  2 NFS関連以外のネットワーク機能が使える
  3 ネットワーク機能がフルで使える
  4 使用されていません
  5 X Window System GUI ログイン
  6 再起動に移行する状態

 現状のランレベルを変更したい場合は以下コマンドを使用する。

run level
N 3

 この出力結果は最初のNが前の状態がないこと(システム起動後にランレベルを変更していないこと)を示しています。

シングルユーザモード

シングルユーザモードは非常に重要です。

システム管理者がrootのパスワードを忘れてログインができなくなった場合等の非常時に使用することができます。

ランレベルに応じたサービスの制御

あるランレベルでシステムを起動させるとき、initプロセスの処理の一部で各種サービスを起動させたり停止させたりすることができます。

具体的にはinitプロセスはランレベル3で起動するとき『/etc/rc.d/rc3.d ディレクトリ』下にあるシンボリックリンクファイルの名前を参照してRPMYUMでインストールされた各種サービスを起動するのか停止するのか判断し実行します。

サービス制御スクリプト

『/etc/rc.d/init.d ディレクトリ』にあるファイルのことをサービス制御スクリプトといい様々なサービスを制御するために使用される実行ファイルです。

リストを表示する際は以下のコマンドに加えて

ls /etc/rc.d/init.d

以下のコマンドも使用できます。

ls service

サービス制御スクリプトは以下の引数を使用して各サービスをコントロールすることができます。

start サービスを起動
stop サービスを停止
restart stop → start
reload 設定ファイルを読み込み直す
status サービスの状態を確認

chkconfigコマンド

RPMでインストールした各サービスを起動したり止めたりするには各サービス用のサービス制御スクリプトを使えばいいことがわかったと思います。ですが、毎回システム起動時にサービスを立ち上げたり止めたりするのは大変です。その場合"chkconfig"コマンドを使用すればシステム起動時にランレベルに応じて各種サービスを起動させたりさせなかったりができます

現状どのサービスがどのランレベルで起動するか確認するときは以下コマンドを使用します。

chkconfig --list | less

特定のサービス(今回はsshd)だけを確認したい場合は以下コマンドを実行します。

chkconfig --list sshd

これをランレベル3と5で起動しない(する)ように変更したい場合

chkconfig --level 35 sshd off(on)

/etc/rc.d/rc.rocal スクリプト

initプロセスによって起動されるサービス制御スクリプトのうち最後に実行されるスクリプトになります。起動時に自動的にシステムに実行させたい設定などはこのファイルに記述を行います。ソースファイルからプログラムをインストールした場合はこのrc.localファイルにデーモン起動の処理を記述します。そうすることでシステム起動時にそのサービスを実行することが可能になります。

                                                                                                 以上