hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

Linuxコマンド、パーミッション、ログ出力・見方

Linux

Linuxは、サーバー向けによく利用されている「OS」の一種。

Linuxとは

Linux (リナックス)は、コンピュータ用の OS(オペレーティングシステム)の一種。OS とは、operating systemの略で、コンピュータ全体を管理している基本的なプログラムのこと。

OSは、普段私たちが「当たり前だと思う機能」を提供してくれる。

たとえば、

  • キーボードから文字を入力すると、入力した文字が画面に表示される。
  • マウス・タッチパネルなどで画面を操作できる。
  • イヤフォンをさすと、イヤフォンから音が聞こえる。

などの機能。

OSには、Linuxの他にも「MacOS」「Windows 10」などがある。

Linuxの特徴

Linuxは、サーバー向けによく利用される。サーバー向けに利用されるのには、以下の特徴を Linuxが持っているため。

  • オープンソースであり、誰でも自由に無償で利用できる
  • 品質の高い多くのソフトウェアが利用できる
  • 世界中でサーバ用途として広く利用されているため信頼性が高い
  • 操作を自動化するための仕組みが用意されており、サーバの運用が行いやすい

ディストリビューション

Linuxは、OSの中核である「カーネル」とOSを構成する他のプログラムから出来ている。しかし、実際はこのカーネルだけでは何も動かないので、様々なソフトウェアを組み合わせることで動くようになる。その作業は一般ユーザには難しく、時間や労力もかかる。そこで、すぐに動かすことができるようカーネルと様々なソフトウェアを最初から組み合わせたものを配布するようになった。これをディストリビューションと呼ぶ。

CentOS
CentOSとは、「Red Hat Enterprise Linux」(RHEL)のソースコードを元に開発が進められている無償ディストリビューション。サーバーを構築したいユーザーを中心に人気があり、企業での利用実績も多く、信頼性に定評がある。

Ubuntu
Ubuntu(ウブントゥ) とは、「初心者にやさしい」と言われるメジャーな無償ディストリビューション。家庭・学校・職場で必要とされるワープロやメールソフトから、サーバーソフトウェアやプログラミングツールまで、あらゆるソフトウェアが含まれている。

ディストリビューションが異なると以下の様な違いが出てくる。

  • ディレクトリの構造が異なる
  • パッケージ・マネージャが異なる
  • 標準でインストールされているアプリケーションや自動で起動するプロセスが異なる
  • コマンドやその使い方が異なる

パッケージ・マネージャ

パッケージ・マネージャとは、コンピュータに何のソフトウェアがインストールされたかを記録し、新しいソフトウェアのインストール・新しいバージョンへのソフトウェアの更新・以前インストールしたソフトウェアの削除を容易に行えるようにするプログラムのこと。

yumコマンドは、パッケージをインストール/アップデートするコマンド。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# パッケージをインストールする
$ yum install [ファイル名]

# システムにインストールされているパッケージをアップデートする
$ yum update

# パッケージをアンインストールする
$ yum remove [ファイル名]

# サーバーにあるパッケージを一覧する
$ yum lis

基本的なコマンド

シェルとは

Linuxサーバに対して作業したい場合は、ターミナル等を用いてコマンドを利用する。その時にユーザーの入力したコマンドを解釈するソフトウェアのことを「シェル」と呼ぶ。

ls

lsコマンドはlistの略で、フォルダやファイルの一覧を表示するコマンド。カレントディレクトリの直下にあるファイルやフォルダの名前が一覧で表示される。
使い方はターミナルで「ls」と打ち込んでエンターを押すだけ。

1
2
$ ls
# 今いるディレクトリの直下にあるファイルやフォルダの名前の一覧を表示します

ディレクト

ディレクトリとはコンピュータ上で複数のファイルを整理するためのフォルダのこと。PCの実体はディレクトリによる階層構造になっており、ディレクトリの中にさらに多くのディレクトリやファイルが保存されている。

カレントディレクトリ(.)

カレントディレクトリとは、ターミナルで現在作業中となるディレクトリのことを指す。ここを基準に、PCに命令を出していく。

ディレクトリ(..)

あるディレクトリに対して、階層構造において1つ上のディレクトリのこと。

ホームディレクトリ(~)

ホームディレクトリは新規にターミナルを立ち上げた場合に作業中となるディレクトリ。〜で表される。Macでのデフォルトのホームディレクトリは/Users/ユーザ名となる。

この画面上ではカレントディレクトリは「〜」になっているので
現在、作業中のディレクトリ(カレントディレクトリ)はホームディレクトリということになる。

ルートディレクトリ(/)

ディレクトリは階層構造になっているので、あるディレクトリは他のディレクトリに属している。その階層構造の一番上にあるディレクトリがルートディレクトリ。

cp

cpコマンドはcopyの略で、そのままファイルをコピーするためのコマンド。

記述方法:

1
$ cp [コピー元] [コピー先]

実際に見てみましょう。

1
2
3
4
5
# test_copy.rbにtest.rb の内容をコピーする場合
$ cp test.rb test_copy.rb

# 複数のファイルをコピーする場合
$ cp test.rb test1.rb  test_copy.rb

mv

ファイルの移動およびリネームを行うコマンド。

記述方法:

1
2
3
4
5
#ファイルの移動
mv [移動させたいもの] [移動先]

# 名前変更
mv [元のファイル名][新しいファイル名]

rm

ファイルを削除するコマンド。

記述方法

1
rm [削除したいファイル名]

mkdir

Linuxで新規にディレクトリ(フォルダ)を作成するコマンド。

記述方法

1
mkdir [ディレクトリ名]

touch

指定したファイルが存在しない場合は空のファイルを新規に作成してくれるコマンド。
また、指定されたファイルへのアクセス時刻と更新時刻を現在の時刻に変更することも可能。任意の時間に変更することもできる。

記述方法

1
2
3
4
5
 # 新規のファイルを作成する・アクセス時刻と更新時刻を現在の時刻に変更
touch [ファイル名]

#  sampleファイルのアクセス時刻や最終更新日時を2019年10月1日15:00に変更
touch -t 201910011500 sample

-t 日時と指定することで、指定した時刻にアクセス時刻と更新時刻を変更できる。

cat

ファイルの内容を結合し、表示するコマンド。

記述方法

1
2
3
4
5
# ファイルの閲覧
cat [ファイル名]

# ファイルの結合
cat [ファイル1] [ファイル2]

3つのファイルを結合することもできる。cat [ファイル1][ファイル2][ファイル3]と記述すれば、ファイル1・ファイル2・ファイル3が結合する。

tail

ファイルの終わり部分を表示するコマンド。 オプションをつけずに実行すると終わりから10行表示される。
tailコマンドを使ってエラーログを確認することができる。サーバー構築をする際にはエラーログをファイルの末尾に追加していく。そのため、tailコマンドを使用することで、新たに追加されたエラーログを確認できる。

1
$ tail -f error.log

上記のコマンドはerror.logというファイルを確認するためのコマンド。tailに続けて-fというオプションを追加している。
このオプションを追加することで新たにエラーログが追加されるたびに、自動で新しいエラーログを表示してくれるようになる。

エラーログの自動表示を終了したい場合はCtrl + Cで終了することができる。

エラーログを確認する必要がある時はtailコマンドを使用する。

vi

サーバ上で設定ファイル等を編集したい場合エディタが必要になる。
CentOSAmazon Linuxには標準でviというソフトウェアがインストールされているので、特に理由がない限りこれを利用する。

他にも、viを発展させたvimや、異なる思想で開発されたemacsというエディタもあるが、長期間にわたって動作するWEBサーバに不必要なソフトウェアをインストールすることは、サーバを不安定にすることもあるので、出来る限り不要なものを導入したくないという理由がある。

viエディタで実際の設定ファイルを編集する場合の流れは、以下の通り。

1.「通常モード」でファイルを開く
2.「インサートモード」でファイルを編集する
3. 再び「通常モード」へ移行し、「:wq」で保存して終了する

 

viを開く

viを開くときのコマンドは、vi [ファイル名]です。指定されたファイルが無い場合は新規作成してくれる。

1
2
3
4
# ホームディレクトリに移動
$ cd
# sampleファイルをviで開く
$ vi sample

実行すると画面下に「“sample” [New File]」と出力される。これは、sampleという新しいファイルを作成したという表記。

通常モード

viエディタには「通常モード」と「インサートモード」がある。通常モードは、viエディタにコマンドを打つことでファイルを保存したりviコマンドを終了したりできる。

「通常モード」のコマンドには以下のようなものがある。

コマンド 説明
:w 作成・編集したファイルを保存。
:q viコマンドを終了。
:q! 編集した内容を保存しないでviコマンドを強制終了。
:wq 編集した内容を保存してviコマンドを強制終了。

i (インサートモード), ESC

「通常モード」では、文字を入力することができない。文字を入力したい場合は、インサートモードにする必要が有る。「I」キーを押すとインサートモードになり、文字の入力が可能。

Escキーを押すと通常モードに戻る。

/ (検索)

viエディタで文字列を検索するには、通常モードで「/」(スラッシュ)を入力し、その後に検索したい文字列を入力し、「Enter」キーで実行することが出来る。

u (アンドゥ)

カットやペースト・置換・挿入モードに入ってから挿入モードを抜けるまでの一連の文字入力など、ファイル中の文字に影響を与えた動作を1つ取り消すことができるコマンド。

サーバ設定

Linuxは、1つのマシンへ複数のユーザーが同時にログインして操作することを前提として作られている。しかし、自分が見られたくないファイルまで他のユーザーに見られたり、他のユーザーにファイルを編集されては困る。これらの問題を防ぐための仕組みがある。

一般ユーザーとrootユーザー

一般ユーザーとrootユーザーの主な違いは、ファイルに対して権限レベルの違いである。一般ユーザーは自分の許可されているファイルしか操作できない。root ユーザーには他のユーザーが所有するファイルも含めて、全ての制御権限がある。

SSHでリモートサーバにログインする時にユーザー名を指定してログインすることで、リモートサーバでの権限を調整することができる。

1
2
$ ssh root@example.com
$ ssh taro@example.com

rootユーザーはサーバ上の全てのファイルの閲覧することができ、すべてのコマンド実行することができるので、SSHを使ってrootユーザーを使うことは避ける。

sudo, su

SSHを使って一般ユーザーとしてリモートサーバにログインした後に、ソフトウェアのインストールなどで一時的に管理者権限が必要になることがある。また、サーバ内の他のユーザーに代わってコマンドを実行する必要がある場合もある。

sudo
sudoコマンドは、現在のユーザーのまま他のユーザーに成り代わってコマンドを実行することができる。ただし、sudoコマンドを使うためには、予めsudoが使える権限がそのユーザーに付与されている必要がある。

su
suコマンドは、他のユーザーにログインし直す事ができる。このコマンドはいつでも使うことができるが、成り代わろうとしているユーザーのパスワードが必要。

所有者とは

1つのLinuxシステムを複数のユーザーで使用している場合、自分が作成したファイルを他のユーザーに変更されたくない場合がある。

ファイルには、その持ち主がいる。その持ち主を所有者と呼ぶ。ファイルを作成すると、作成したユーザーがその所有者として設定される。所有者にだけ書き込み権限を与えておけば、そのファイルを他のユーザーに変更される心配はない。

パーミッションとは

パーミッションとは、ファイル、またはディレクトリに対して「誰にどのような操作を許可するのか」という権限を規定した情報のこと。
所有者、その他のユーザーのそれぞれに対して、読み込み(r)、書き込み(w)、実行(x)の権限を与えるものになる。ユーザーがどのような権限を持っているかによって、できることが変わってくる。

読み込み(r)、書き込み(w)、実行(x)の権限の確認は、ls -l [権限を確認したいファイルのパス]で確認することができる。

1
2
$ ls -l projects/pictweet
drwxr-xr-x  22 takatahinako  staff      748  8 12 11:51 pictweet

「誰にどのような操作を許可するのか」というのは、ターミナルに出力される「 rwx r-x r-x 」の部分で確認できる。pictweetのパーミッションは以下のようになっている。

所有者
読み込み権限(r)・書き込み権限(w)・実行権限(x)が可能。

グループユーザー
読み込み権限(r)・実行権限(x)が可能。

一般ユーザー
読み込み権限(r)・実行権限(x)が可能。

また、パーミッションは自分で権限を変えることもできる。
それぞれの権限には、r=4、w=2、x=1 という数字が割り当てられている。アクセス権限は、3桁の数字で表される。一桁ずつが権限を与える所有者、グループ、そして一般ユーザーを表している。

1桁目が、マスター権限を持っているユーザー。

2桁目がグループに属しているユーザー。

3桁目がその他のユーザーです。

マスター権限とは、ファイルやディレクトリの所有権のこと。

そして、それぞれの桁の数字は、各ユーザーが所有しているアクセス権限の数値を足し合わせた値になる。

 

例えば、755という値について見てみると、

一桁目の7がr=4、w=2、x=1の合計になっている。つまり、マスター権限を持っているユーザーが、読み、書き、実行、の全てを行うことができるという意味になる。二桁目と三桁目は、共に5。これは、r ( = 4 ) + x ( = 1 ) の合計なので、グループに属しているユーザーと、属していない一般のユーザーには、ファイルの読み込みと実行はできるけれど書き換える権限が与えられていないということになる。

https://tech-master.s3.amazonaws.com/uploads/curriculums//24d864e682fd2c20e9d5d54b97401107.png

chmod, chown

chmod
chmodコマンドは、アクセス権限を書き換えるためのコマンド。chmod [与える権限の種類] [権限を行使する主体]という構成で入力する。

[与える権限の種類]とは、パーミッションでのそれぞれの権限に割り当てられている、読む権限(r)=4、書く権限(w)=2、実行する権限(x)=1を足し合わせた数値が3桁入る。
[権限を行使する主体]とは、権限を与えるファイル、またはディレクトリのことを示している。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# pictweetのアクセス権限を確認
$ ls -l projects/pictweet
drwxr-xr-x  22 takatahinako  staff      748  8 12 11:51 pictweet

# アクセス権限を変更
$ chmod 777 projects/pictweet

# アクセス権限を確認
$ ls -l projects/pictweet
drwxrwxrwx  22 takatahinako  staff      748  8 12 11:51 pictweet

chmodメソッドでそれぞれのユーザーが読み込み権限(r)・書き込み権限(w)・実行権限(x)が可能になるように権限を変更した。

chown
chownコマンドは、ファイルやディレクトリの所有者を変更するコマンド。chown [所有者][ファイル名・ディレクトリ名]という構成で入力する。

ターミナルにコマンドのプロセスを表示

サーバー構築の際には自分が実行したコマンドがきちんと動いているかどうかを確認しなければならない場面が数多く登場する。自分が実行したコマンドの実行状況を確認するにはプロセスを確認する必要がある。

プロセスとは

WEBサーバやコマンドなどLinux上で実行されている処理はそれぞれプロセスと呼ばれる。プロセスはプロセス名とプロセスIDという番号が自動的に付与される。

プロセス以下のような性質がある

  • プロセス毎に自分だけのメモリを割り当てられる
  • WEBサーバなどネットワーク機能を利用するプロセスはポートを専有する

Linux上では100を超えるプロセスが動いているが、1つのCPUが一度に実行できるプロセスは1つだけ。そのため、非常に細かい時間間隔で、多くのプロセスが限られたCPUを奪い合っているという状況になっている。

プロセスを確認する

プロセスを確認するためにはpsコマンドというコマンドを実行する必要がある。ターミナル上でpsコマンドを使用すると以下の様な表示になる。

この一行一行が現在実行中のプロセスということになる。※表示される内容は使用PCによって異なる

psコマンドの様々なオプション

psコマンドは様々なオプションを持つ。その中でもよく使うオプションを以下に挙げる。

オプション名 意味
-a 自分以外のユーザーのプロセスも表示。
-r 実行中のプロセスのみを表示。
-u ユーザー名 ユーザー名とプロセスが実行された時刻を表示。
aux 実行中のすべてのプロセスに関してCPU使用率などの詳細な情報つきで表示。

複数のコマンドを組み合わせる方法

ターミナル上でコマンドを利用する際は複数のコマンドを組み合わせることで目的を達成しなければならないことがある。その様に複数コマンドの組み合わせを実現するのが| (パイプ)処理と呼ばれるもの。

| (パイプ)処理

パイプ処理とは、あるコマンドの結果を次のコマンドに渡す処理のこと。パイプ処理を用いたコマンドの組み合わせは以下の様になる。

1
$ <最初に実行されるコマンド> | <左の結果を受けて最終的な結果を返すコマンド>

コマンドを組み合わせて実行

いくつかのコマンドを組み合わせて利用する方法

①lsで表示したファイル群から特定の文字が含まれるものだけを表示

lsコマンドはカレントディレクトリ以下のフォルダー/ファイルを全て表示させるものだが、grepコマンドと組み合せる事で特定の文字を含むものだけを表示する。

grepコマンド

grepコマンドは特定の文字列が含まれる一行を抽出するためのコマンド。grep [検索ファイル] [検索パターン]のように利用する。

1
2
$ cd ~ #ホームディレクトリに移動
$ ls | grep p  #ホームディレクトリ以下のファイル群から 'p'という文字が含まれるものだけを表示

実行後は下記の画像の様になる。ホームディレクトリ直下のディレクトリ/ファイルの中でもpが含まれるものだけが表示されているのが確認できるはず。※表示される内容は使用PCによって異なる

https://tech-master.s3.amazonaws.com/uploads/curriculums//cba69e821b59bcd7b80f53af6d1a920e.png

mysqlサーバーの実行プロセスを探して表示

psコマンドとgrepコマンドを使って特定のコマンドのプロセスのみを表示出来るようにする。mysqlサーバーの実行プロセスを表示するコマンドは以下の様になる。

1
$ ps aux | grep mysql | grep -v grep

上記の例では3つの事を同時に行っている。

まず 、| の左側のpsコマンドで実行中のプロセスが一覧で取得される。続いて、取得されたプロセスが | の右側の grepコマンドに引き渡されてmysqlと文字が含まれている物だけが抽出される。最後に、grepコマンド自体のプロセスを取除き最終的な結果をターミナルに表示する。

結果としてmysqlのサーバーが上手く起動していれば、mysqlの文字を含んだプロセスを表示し、mysqlが起動されていなければ何も表示されない。

kill <...>

プロセスIDに対して特定のコマンドを実行することで、プロセスを再起動したり、強制終了したりできる。

記述方法

プロセスを終了させる

1
$ kill [プロセスID]

プロセスを強制終了させる

強制終了の場合、オプションで-9をつける。通常のkillコマンドで削除できない場合はこちらを使用する。

1
$ kill -9 [プロセスID]