Linux 基礎

# 概要

- これまでMacで開発等をしているが、Linuxについて調べた内容を発信していなかった
- これまで調べた内容を補足する形でもう一度自分の頭での理解を文章に落とし込んでまとめてみる
実行した例をリンクしている
- 学習の補完として実例を確認し、抽象的な説明に対する具体例として理解の助けになると思う
- 学習しつつまとめているので不足点や解釈違い等ありましたらマサカリお願いします！！

# 1. Linuxとは

- 世界で最も普及している、オープンソースのオペレーティングシステムのこと
- UNIX系OSの一種
- プログラムが公開されており誰でも自由に入手や使用、改変、再配布することが可能
- GPLというライセンスに基づいて無償配布されている
- サーバーOSとしての利用が多い

※Linuxカーネルについて
LinuxOSのカーネル[^1]であるLinuxカーネルもLinuxと呼称される場合がある

## 1.1. なぜLinuxがサーバーOSとしての利用が多いのか

ここで、上記のLinuxの特徴としての「サーバーOSとしての利用が多い」ことについて疑問に感じた(何となくはわかるが言語化できない)
以下が主な理由として挙げられている(他もあると思いますが)

- 料金面

サーバーを構築するときに設定するOSが有料か無料かというところで選ばれる
当たり前といえば当たり前のような理由

- セキュリティ

意外なようではあるが、セキュリティに関して世界中の人々がメンテできるOSSであるLinuxは
セキュリティに対するバグフィックスも常に行われるので、安全に利用することができる

- シェルスクリプト

定型的な作業をスクリプトで実行することが可能(他OSでも同じことはできると思うが)

- ホットなコミュニティの恩恵

OSSであるがゆえに常に様々な情報共有がなされ、それを参照することができるので設定等に困ったときやわからないことがあるときに解決しやすい

## 1.2. 補足なぜWebエンジニアは開発用の端末をMacにするのか

私の意見としては以下理由によりMacを使う方がメリットがあると思っている

- macOSはPOSIX[^2]に準拠したUNIX
- LinuxもPOSIXにおおむね準拠している(IEEEから公式認証を受けてはいない)[^3]
- POSIXではのOS間ではコマンドやプロセス環境、ファイル、ディレクトリなどが規格として定められている
- POSIX規格準拠のOS間でのコマンドなどは共通しているため、ファイル操作他理解が統一できる

最近ではWindowsにもWSLという機能のおかげでLinuxライクに開発できるみたいだが、少なくとも自分のころのWSLは使いにくく挫折した

参照

- [POSIXコマンドチートシート](https://qiita.com/richmikan@github/items/e4cb1537d38966c10f4b)
- [Wikipedia/macOS](https://ja.wikipedia.org/wiki/MacOS)
- [Wikipedia/POSIX](https://ja.wikipedia.org/wiki/POSIX)

## 1.3. Linuxディストリビューション

###  1.3.1. Linuxディストリビューションについて

- LinuxディストリビューションはLinuxカーネルとその他ソフトウェア群を1つにまとめ、利用者が容易にインストール・利用できるようにしたもの

Linuxカーネル(共通) ＋ それ以外のディストリビューション別パッケージ　のようなイメージ

- ディストリビューションの選択基準は利用目的やパッケージシステム、コンパイラ等様々ある
- また、Linuxディストリビューションにも商用(企業が開発し、商用サポート等も受けれられる)とコミュニティ主導のものがある

### 1.3.2. 主流Linuxディストリビューション派閥

Linuxディストリビューションの中でも流派が存在し、そこから枝分かれするようにしてディストリビューションが存在する
そんなLinuxディストリビューションの源流の代表的な３つは以下

#### 1.3.2.1. RedHat系

- RedHat社が開発しているディストリビューションであるRHEL(RedHat Enterprise Linux)と機能的に互換性のあるLinuxディストリビューションの総称
- 上記のディストリビューションは有償だが、派生ディストリビューションは無償のものも多い
- 代表的なRedHat系ディストリビューションは`CentOS`と`Fedora`

CentOSによるサーバー構築については以下を参考
[CentOSサーバー構築マニュアル.com](https://centos.server-manual.com/)

#### 1.3.2.2. Debian系

- コミュニティベースのディストリビューション
- パッケージマネージャは[APT](https://eng-entrance.com/linux-package-apt-2)
- 代表的なディストリビューションは`Ubuntu`や`Linux mint`

##### 1.3.2.3. Slackware系

- 数あるLinuxディストリビューションの中でも特に歴史の長いものの一つ
- パッケージ管理にSlackpkgというツールが使用できる(openSUSEというディストリビューション以外)

# 2. Linuxの基本

## 2.1. Linuxの仕組み

- **Linuxカーネル**に対して**シェル[^4]**と呼ばれるソフトウェアを使用してやり取りをする
- Linuxではこのシェルも複数選択することができるようになっている(zsh,bash等)

## 2.2. ユーザー管理について

### 2.2.1. Linuxの利用

- Linuxは1つのコンピュータを複数のユーザーで使用できるように設計されている
- Linuxを利用するには、対象のLinuxに対してログインを行う必要がある
- ユーザー名とパスワードを入力することでログインができる(設定に関しては[別途参照](https://qiita.com/Tooooomin/items/c063cee80227a5f1d95b))

### ※「1つのコンピュータを複数のユーザーで使用できるように設計されている」とは

- 昔は今のように1人に1台PCが割り当てられるのが当たり前ではなかった
- 複数人に一台のコンピュータを利用するために、このような設計になっている
- [参照](https://qiita.com/souchi00)


### 2.2.2. Linuxにおけるユーザーとは

- 特定のLinuxにログインできる利用者のこと
- 分類として一般ユーザーとrootユーザーがある

### 2.2.3. 一般ユーザーとrootユーザーの違い

- rootはシステム管理などのためにほとんどすべての操作権限を有している
- 基本的にシステム管理の作業などにしてもrootユーザーでの操作はセキュリティ上推奨されない
- rootユーザーの情報を盗み取られたら、該当のLinuxにおける操作権限を奪われたといっても過言ではないため

### 2.2.4. sudoについて

- システム管理的な作業を行うときも、一時的に権限を付与するsudo(Superviser Do)というコマンドを使用して実行する
- sudoコマンドは、限られたユーザーしか利用することができない

※限られたユーザーとは
/etc/sudoers[^5]ファイルに設定されているユーザーのこと

### 2.2.5. ユーザーとグループ

- 上記のsudoコマンド他、Linuxはディレクトリやファイルごとにパーミッションという権限設定ができる
- この権限について、個人単位、またはグループ単位に設定ができる
- ユーザーをグループで管理することで、管理を効率的に行うことができる
- ログイン中のユーザー情報については`~/etc/passwd`ファイルに格納されている


- グループ情報については`~/etc/group`ファイルに格納されている

###2.2.6. How To

- ユーザーを追加する
- ユーザーをグループに追加する
- ユーザーをsudoersに追加する
- ユーザー情報を変更する
- ユーザーのグループ情報を変更する

詳細はこちら

https://qiita.com/Islanders-Treasure0969/items/3a74139d08d19f54eab3

## 2.3. ディレクトリ構成

- Linuxディストリビューションの多くはFHS(Filesystem Hierarchy Standard)[^6]という規格に準拠している

```
/
├ /bin
├ /boot
├ /dev
├ /etc
├ /home
├ /lib
├ /mnt
├ /media
├ /opt
├ /proc
├ /root
├ /sbin
├ /tmp
├ /srv
├ /usr
｜ ├ /usr/bin/
｜ ├ /usr/include/
｜ ├ /usr/lib/
｜ ├ /usr/sbin/
｜ ├ /usr/share/
｜ ├ /usr/src/
｜ └ /usr/local/
└ /var
　 ├ /var/lock/
　 ├ /var/log/
　 ├ /var/mail/
　 ├ /var/run/
　 ├ /var/spool/
　 ├ /var/spool/mail/
　 └ /var/tmp/
```

### 2.3.0. /

ルートディレクトリ

### 2.3.1. /bin

システム管理上の基本コマンドが格納されている(cp,chmod等)
FHSによって定められたシングルユーザを含めたどのユーザでも使えるコマンドだけが入る
ここに自分で任意にコマンドを追加することはない
参考：[Linuxの/bin、/usr/bin、$HOME/binのそれぞれの役割](https://qiita.com/totzyuta/items/84d610f56129a186f0c5#bin)

### 2.3.2. /boot

ブートに必要なファイル
ブートログやカーネルイメージ（Linuxカーネルを格納して圧縮したファイル）が保存されている

### 2.3.3. /dev

デバイスファイルが配置されている
ハードウェアにアクセスする実際のドライバ (Linux カーネルの一部) へのインターフェースとなる
参考：[Linux のデバイス](https://www.debian.org/releases/stable/mips/apds01.ja.html)

※/dev/nullについて
UNIXやUnix系オペレーティングシステム (OS) におけるスペシャルファイルの1つ
書き込まれたデータを全て捨て（writeシステムコールは成功する）、読み出してもどんなプロセスに対してもデータを返さない（EOFを返す）

- 使用例

1. 標準出力/標準エラー出力を抑止する目的で使うことがある

```
$ echo "Hello" > /dev/null
```

2. ファイルの中身を強制的に空にしたい場合にも使うことがある

```
$ cat /dev/null > file1.txt
```

### 2.3.4. /etc

設定ファイルを置くディレクトリ
システム、アプリケーション等様々な設定ファイルがあるので数が膨大になる
`/etc/hosts`[^7]や`/etc/services`[^8]がサブディレクトリにある

### 2.3.5. /home

一般ユーザーのホームディレクトリ
ユーザーを追加すると、このディレクトリ直下にユーザー名のディレクトリが追加される

### 2.3.6. /lib

標準的なライブラリを設置するディレクトリ
`/usr/lib`ファイルもあるがこれも切り分け方は上記の`/bin`と同じ
参考：[Linux - Library](https://www.infraeye.com/study/linuxz6.html)

### 2.3.7. /mnt

ファイルシステムの一時的なマウント[^9]ポイント用ディレクトリ

### 2.3.8. /media

リムーバブルメディア[^10]のマウントポイント（floppy、CD、DVDなど）

### 2.3.9. /opt

パッケージ管理ツール以外でインストールしたディレクトリ構造になっているアプリケーションの格納先に適している
基本的に`/usr/local`の構成に従わないパッケージの配置に使用する

- 各サイト等により説明がまちまち(パッケージ管理ツール以外のインストール先とかパッケージ管理ツールのインストール先とか)
- [Wikipedia/FHS](https://ja.m.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)にはそのような規定はない

### 2.3.10. /proc

プロセスのIDの付いたディレクトリが配置されている
プロセス独自の情報を格納することからプロセスディレクトリと呼ばれる
普通のファイルシステムと違い、ハードディスクやSSDなどのストレージ上ではなく、メモリの中に作られるファイルシステム
参考：[/procディレクトリのファイル](https://linuc.org/study/knowledge/526/)

### 2.3.11. /root

rootユーザーのホームディレクトリ
あまり情報が転がっていないので編集したりする場所ではなさそう

### 2.3.12. /sbin

システム管理者用のコマンドが配置されている
新規でコマンドを追加することはない
当初は起動に必要なため作成されたディレクトリであったが、現在では上記のような用途になっている
参考：[/sbin](https://www.wdic.org/w/TECH//sbin)

### 2.3.13. /tmp

ファイルなどを一時的に保管するディレクトリ
システムの再起動でディレクトリ内のファイルはすべて削除される
基本的にはプログラムのためのディレクトリで、ユーザが利用するディレクトリとは考えられていない

※`/tmp`と`/var/tmp`の違い
一時ファイルを補完するディレクトリは`/tmp`以外に`/var/tmp`が存在する
`/tmp`は再起動で削除され、`/var/tmp`は再起動でも削除されない
それ以外でも基本的に`/var/tmp`のほうが保管期間が長いらしい
参考：[/tmpと/var/tmpの仁義無き戦い](https://qiita.com/kuni-nakaji/items/f29be14be578b5a19d4b)

### 2.3.14. /srv

システムに提供されたサイト固有のデータ

### 2.3.15. /usr

各ユーザーが共通して利用するプログラムやライブラリなどが置かれるディレクトリ
各ユーザー単位のディレクトリではない点に注意する
尚、`/usr`ディレクトリはサブディレクトリも重要な点が多い

#### 2.3.15.1. /usr/bin

一般ユーザーが共通で使用するコマンドが格納される場所
ユーザー単位でインストールするコマンドはここには格納されない(`/usr/local/bin`等に格納される)

#### 2.3.15.2. /usr/include

C言語用ヘッダーファイルの保存場所
参考：[C言語におけるinclude文とgcc -Iオプションの関係](https://qiita.com/DQNEO/items/4e5c2eca2761ec08b922)

#### 2.3.15.3. /usr/lib

`/lib`とほとんど同じ立ち位置

#### 2.3.15.4. /usr/sbin

管理者用コマンドが配置されている
`/sbin`はroot以外は通常はパスが通っていないのでデフォルトでは使用できない

#### 2.3.15.5. /usr/share

アーキテクチャに依存しないファイルが置かれる
具体的にはマニュアル(man)やロケール設定ファイル(locale)等が置かれる
参考：[「/usr/share」ディレクトリ](https://linuc.org/study/knowledge/546/)

#### 2.3.15.6. /usr/src

プログラムのソースコードが置かれる
インターネットなどから入手したソフトウェアをソースコードからコンパイルする場合、このディレクトリに配置することが慣例になっている

#### 2.3.15.7. /usr/local

システム管理者が自分でアプリケーションをインストールする場所として利用するディレクトリ
サブディレクトリはbin、games、include、lib、man、sbin、share、srcが必須となっている
各サブディレクトリの用途は、/usrや/にある同名のディレクトリに準ずる
参考：[/usr/local/の使い方まとめ](http://dqn.sakusakutto.jp/2011/08/linux_usrlocal.html)

### 2.3.16. /var

常に変化するファイルを格納するディレクトリ
ログや一時ファイル等の格納など、各種用途に使われる
尚、`/var`ディレクトリはサブディレクトリも重要な点が多い

#### 2.3.16.1 /var/lock

排他制御を行う場合に利用する
ファイル書き込みの際にこのディレクトリにファイルを新規で作成し、他のプロセスで同じファイルに書き込み処理をするときはこのディレクトリに同様のファイルが存在しないか確認する
イジることはほとんどないが、システムの異常終了で書き込みファイルがディレクトリに残ったままになったりするとエラーになったりすることが考えられる
参考：[/var/lock](https://linuc.org/study/knowledge/522/)

#### 2.3.16.2. /var/log

システム、メール、インターネットのアクセスログなど、あらゆるログが保存される
ログ調査をする際に確認するディレクトリになる
参考：[Linux - /var/log/messages](https://www.infraeye.com/study/linuxz46.html)
参考２：[必読！ログファイルとディレクトリ](https://thinkit.co.jp/article/711/1)

...ログに関しては別途調べてまとめる必要がありそう

#### 2.3.16.3. /var/mail

メール関連の動的ファイルを管理する
通常`/var/spool/mail`へのシンボルリンク
`/var/spool/mail`にはデフォルトではシステムからのメールが届く
`mail`コマンドを管理者権限で実行することでメールを閲覧することができる
参考：[var/spool/mail](https://tokyo-teacher.com/article/sj-pg/sj-pg-6-lx/sj-pg-lx-centos-var-spool-mail/)

#### 2.3.16.4. /var/run

システムを起動した後の情報が格納されるディレクトリ
主に実行中のプロセスに関する情報が格納された**pidファイル**が存在する
参考：[「/var/run」ディレクトリ](https://linuc.org/study/knowledge/523/)

※pidファイルについて

該当するプロセスのプロセスIDなどの情報が記述されている
プロセスIDが記述されているので、このファイルはプロセスの制御（再起動や停止など）、プロセス同士の連携などに利用される
対応するプロセスが起動中にはPIDファイルが存在し、終了後には削除される
プロセスが起動する際に対応するPIDファイルが存在するとプロセスが起動中とみなされてエラーになってしまうので、そういう時には対応するPIDファイルを削除する必要がある
参考：[pidファイルに関して](https://skill-up-engineering.com/2018/06/27/pid%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6/)

#### 2.3.16.5. /var/spool

スプールファイル（実行ファイル・データの一時的な保存）を保存する
処理待ちが発生する際に、直接データを送るのではなく、スプールにデータを仮置きし、そこからデータを順次送ることでユーザーはほかの作業を行うことができる
参考：[「/var/spool」ディレクトリ](https://linuc.org/study/knowledge/524/)

#### 2.3.16.6. /var/spool/mail

互換のために残された、かつてのユーザーのメールボックス

#### 2.3.16.7. /var/tmp/

システム関連の一時ファイルを保存する
再起動後もデータは保持される
cron[^11]によって削除の期間が設定されている

### 2.3.17. How To

How To の範囲が膨大すぎるので割愛する
各自調べながらその都度`2.3.x.y`に対応させていく

## 2.4. パーミッション

### 2.4.1 パーミッションとは

ファイルやディレクトリに対して許可属性を設定することができる
この許可属性のことを**パーミッション**という
許可属性には

1. 読み込み(read)
2. 書き込み(write)
3. 実行(execute)

があり、

1. 所有者(ファイル作成者)
2. グループ
3. その他のユーザー

という単位でコントロールすることができる

### 2.4.2. なぜパーミッションを設定するのか

**セキュリティの観点**からパーミッションを適切に設定することは非常に重要である
システム管理者は**ユーザーに対して必要最小限の権限のみを持たせる**ことで、**不必要な変更をできないようにし、また外部からのアクセスも防止する**ことができる

### 2.4.3. パーミッションの見方

適当なファイルのパーミッションを確認する
`ls -l`で確認できる

※ -lオプション
lsコマンドで指定のディレクトリのファイルを確認する際にその詳細も確認できるオプション
参考：[lsコマンドの使い方と覚えたい15のオプション【Linuxコマンド集】](https://eng-entrance.com/linux_command_ls#-l) 

```
$ touch sample.txt
$ ls -l sample.txt
> -rw-r--r-- 1 Islanders-Treasure users 0 6月 29 15:00 sample.txt
```
####2.4.3.1. それぞれの記号の意味

`ls -l`で出力される内容の各行の列単位は以下のフォーマットで記載される

- 先頭桁

ファイルの種類を表す

- 2-4桁

ファイルの所有者のパーミッションを表す

- 5-7桁

グループに対するパーミッションを表す

- 8-10

その他に対するパーミッションを表す

- Islanders-Treasure

所有者名を表す

- users

グループ名を表す

- 0

ファイルサイズ(byte)

- 6月 29 15:00

タイムススタンプ
更新日時が表記される

- sample.txt

ファイル名

以下にファイルの種類やパーミッションの種類を示す

##### 2.4.3.1.1. ファイルの種類

- d

ディレクトリを表す記号

- l

リンクファイルを表す記号

- 「-」

指定なしということを表す記号

##### 2.4.3.1.2. 実行権限

- r

読み込み許可を表す記号
ファイルが開けるかどうかの権限

- w

書き込み許可を表す記号
`r`と組み合わせて使用する
所有者には書き込みと読み込みの両方の権限が割り当てられる事が多い

- x

ファイルの実行権限を表す記号
**ディレクトリは実行権限がないと開くことができない**

### 2.4.4. パーミッションの変更方法

- 具体例

下記の２つは同じパーミッションの設定を行っている

```
$ chmod 755 sample.txt #数値での指定
$ chmod a+wx,u+r sample.txt #記号での指定
```

#### 2.4.4.1. 数値で指定する

1桁3ビットの3桁で指定する
それぞれの桁のパーミッションは以下

- 1桁　所有者
- 2桁　グループ
- 3桁　その他のユーザー

3ビットを2進数記法で表現する

1ビット目　実行権限
2ビット目　書込権限
3ビット目　読込権限

具体的には以下

|数値  |権限  |
|---|---|
|0  |---|
|1  |--x|
|2  |-w-|
|3  |-wx|
|4  |r--|
|5  |r-x|
|6  |rw-|
|7  |rwx|

よって

```
$ chmod 755 sample.txt
```

は、
**sample.txtというファイルに対して**
**所有者に対してすべての権限を付与**
**グループとそれ以外に対して実行権限と読込権限を付与する**
ことになる

#### 2.4.4.2. 記号で指定する

- 記述フォーマット

[権限の範囲][権限の追加、削除の指定][付与する権限]

- 権限の範囲の記号

|記号  |意味  |
|---|---|
|u  |所有者の権限|
|g  |グループの権限|
|o  |その他のユーザーの権限|
|a  |すべての権限|

- 権限の追加、削除の指定の記号

|記号  |意味  |
|---|---|
|+  |後に記述した権限を付加|
|-  |後に記述した権限を削除|
|=  |後に記述した権限にする|

- 付与する権限の記号

|記号  |意味  |
|---|---|
|r  |読込権限|
|w  |書込権限|
|x  |実行権限|
|s  |セットID|
|t  |スティッキービット|

※セットIDとは
他人が実行する際に、設定したIDで実行することができる機能
SGID(Set Group ID)やSUID(Set User ID)などがある
参考：[【 chmod 】 ファイルやディレクトリのアクセス権を変更する](https://xtech.nikkei.com/it/article/COLUMN/20060227/230728/)

- SGID

他人が実行する際、設定してあるグループの権限で実行する

- SUID

他人が実行する際、設定してある所有者の権限で実行する

- 確認方法

パーミッションの実行権限のフラグに「s」が立っていれば他人はその権限で実行できる

具体例

```
$ ls -l
> -rwxrwsr-x   1 foo     foogroup      154 Nov 08 12:30 sample
```

上記では他人は**foogroup**というグループの権限で実行できることになる

### 2.4.x How To

- パーミッションを確認する

任意のフォルダで適当にファイルを作成して`ls -l`で確認する

```
$ touch sample.txt
$ ls -l
> -rw-r--r--  1 username  staff  0  6 30 21:31 sample.txt
```

- パーミッションを変更する

上記で作成したファイルの実行権限を変更する

```
$ chmod 755 sample.txt
$ ls -l
>  -rwxr-xr-x  1 username  staff  0  6 30 21:31 sample.txt
```

- セットユーザーIDを付加する


セットグループIDを付加する

## 2.5. プロセスとジョブ

### 2.5.1. プロセスとは　[参考](https://www.atmarkit.co.jp/ait/articles/1706/23/news010.html)

Linux上で動作中のプログラムのこと
プログラムは、実行されるときに任意のID(PID)を設定し、プロセス固有のメモリ空間を確保して読み込まれ、CPUによって上から順に実行される
例えば、`ls`コマンドをシェルで実行すると、`ls`のプロセスを生成し、そのプロセスがコマンドを実行することになる

プロセスを実際に覗いてみる
`ps`コマンドを実行すると端末で稼働しているプロセスが表示される

※別端末で動作するプロセスの詳細も確認するには
`a`オプションと`u`オプションを付加することで確認する
`a`オプションで別端末のプロセス情報を表示し、`u`オプションでユーザー名などの情報も併せて表示する

[wip] ps -auコマンドの実行結果を載せる

以下で`ps -au`コマンドの列で解説する必要のある項目を解説する

#### 2.5.1.1. TTY

端末番号を表示する列
プロセスが動作している端末のこと
telnetやsshによるログインは仮想端末(presudo terminal)として「pts/番号」で表示される

#### 2.5.1.2. PID

プロセス単位で振られる固有の番号のこと
OSやほかのプロセスから指定して何らかの命令を与えるときの識別子として利用される
参考：[プロセスID(PID)](https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9ID.html)

### 2.5.2. 親プロセスと子プロセス

プロセスには親プロセスと子プロセスというのがある
プロセスは、処理の過程で別のプロセスを作成することがある
`プロセスに作成されたプロセス`を**子プロセス**と呼び、`子プロセスを生成したプロセス`を**親プロセス**と呼ぶ
子プロセスは生成された時点で一意なPIDと親プロセスを指し示すPPID(Parent Process ID)に親プロセスのPIDが設定される
CentOSの場合、最初に動くプロセスは`systemd`というPID＝1のシステム管理用デーモンプロセスである
このプロセスからほかのプロセスは生成されることになる
よって、一見親プロセスのないように見えるプロセスはPPID=1が親プロセスとなる

※親プロセスが終了すると
子プロセスはPPID=1を親プロセスとして生き残ることになる
親プロセスが終了したら単純に子プロセスも終了するわけではないことに注意する

- 親プロセスと子プロセスの関係を確認する

```
$ ps af #端末上のプロセスを階層表示する f(--forest):ツリー上で確認する
[wip]実行結果を表示する
```

- プロセスと一緒にPPIDも確認する

```
$ ps aux #
[wip]実行結果を表示する
```
### 2.5.3. プロセス管理

プロセスはその内部実装まで調べたらすごく深い話になる
とりあえずリンクだけ用意して後で調べるようにする。。。
参考：[プロセス管理とスケジューリング](https://syuu1228.github.io/process_management_and_process_schedule/process_management_and_process_schedule.html)

## 2.6. リダイレクトとパイプライン

### 2.6.1. リダイレクト

元の意味はプログラムが処理するデータの向け先を変更するという意味で使用される
Linuxでは標準出力[^13]や標準入力[^12]の向き先を変更するという意味で使用する

#### 2.6.1.1. リダイレクトの使用シーン

標準出力を任意のファイルに出力するときなどに使用する
具体的には`PATH`を通すときにも使用するので、頻繁に使用することになる

#### 2.6.1.2. 標準出力のリダイレクト

`>`で標準出力をファイルにつなぐことになる
`>`ではファイル内を上書きするので、他に内容があっても消されてしまう点に注意

```
$ echo Hello World > sample.txt
$ cat sample.txt
> Hello World
```
また、`>>`で追記をすることができる

```
$ cat sample.txt
> Hello World
$ echo Bye World >> sample.txt
4 cat sample.txt
> Hello World
> Bye World
```

#### 2.6.1.3. 標準エラー出力のリダイレクト

標準エラー出力をリダイレクトするにはファイルディスクリプタを指定して向き先を指定する必要がある

```
$ cat sample1.txt > sample.txt
> #エラー
$ cat sample1.txt 2> sample.txt #fd=2(標準エラー出力)を指定する
```

#### 2.6.1.4 ファイルディスクリプタ(fd)

すべてのプロセスに備わっているファイル書き込み用の通信チャネルのこと
以下のfd=0～2はプロセス生成時に作成され、汎用ファイルディスクリプタは必要に応じてプロセスが作成する

- 標準入力(fd=0)
- 標準出力(fd=1)
- 標準エラー出力(fd=2)
- 汎用(fd=3～)

参考：[標準入力/出力とパイプ,リダイレクト,file descriptorの仕組み ~squidで枯渇時の対処例~](https://milestone-of-se.nesuke.com/sv-basic/linux-basic/fd-stdinout-pipe-redirect/)

#### 2.6.1.5. 標準入力のリダイレクト

イメージしづらいが、標準入力に対してファイルを当てるイメージ
以下は標準入力の内容をgrepコマンドで、リダイレクトしたファイルの中を検索するという内容

```
$ grep 'He' < sample.txt
> Hello
```

### 2.6.2. パイプライン

あるプロセスの出力を別のプロセスの標準入力とつなげる仕組みを**パイプ**という
例えば、あるファイルの中身を出力し、それをgrepコマンドで検索するために標準入力として受ける場合は以下
コマンドの出力を入力として受けとって処理することはたくさんあるので理解すること

```
$ cat sample.txt | grep Hello
> Hello
```
## 2.7. パッケージ管理

プログラム本体、ライブラリや設定ファイル等を1まとめにしたものを**パッケージ**という
Linuxでは、パッケージを個別にインストールすることもできる
だが、パッケージはそれ単体で動くということはまれで、たいていはほかのパッケージに依存している
これをマンパワーで解決することはきついので、**パッケージ管理システム**というものを通常は使用する
機能については他のシステムのパッケージマネージャーと同類になる
ディストリビューションによってデフォルトのパッケージマネージャーが異なる
以降の説明では`CentOS`のパッケージマネージャー前提で説明を行う

### 2.7.1. RPM

RedHat系ディストリビューションでデフォルトのパッケージマネージャー


### 2.7.2. yum

RPMの上位互換のパッケージマネージャー
RPMとやることは同じだが使い勝手が良いためこちらが好まれることも多い

[RPM](https://eng-entrance.com/linux-package-rpm)
[yum](https://eng-entrance.com/linux-package-yum)

## 2.8. シェルスクリプト

[シェルスクリプトまとめ](https://eng-entrance.com/category/linux/linux-shellscript)
ボリュームが多いので、別でまとめてもいいかも

## 2.9. ログ管理

[Linuxのログの基本と活用法とは](https://www.manageengine.jp/products/EventLog_Analyzer/linux-auditing-reporting.html)

# まとめ

- よくわからんけど2章の中にセクションを追加して2章のボリュームがめちゃ多くなってしまった


[^1]: OSの中核となる部分。アプリケーション(ソフトウェア、ミドルウェア)とハードウェアレベルでのデータ処理の間を取り持つ [参照](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB#%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E6%A9%9F%E8%83%BD)
[^2]: 主にUNIX系OSに共通する機能などについて、プログラムからの呼び出し方法などの標準を定めた規格 [参照](https://ja.wikipedia.org/wiki/POSIX)
[^3]: 電気・情報工学分野の学術研究団体（学会）、技術標準化機関 [参照](https://ja.wikipedia.org/wiki/IEEE)
[^4]: コンピュータのOS（オペレーティングシステム）を構成するソフトウェアの一つで、利用者からの操作の受け付けや、利用者への情報の提示などを担当するもの [参照](https://e-words.jp/w/%E3%82%B7%E3%82%A7%E3%83%AB.html)
[^5]: sudoに関する設定の定義ファイルのこと 編集方法については[こちら](https://changineer.info/server/centos_basic/sudoers.html)を確認
[^6]: Linuxを含むUnix系オペレーティングシステム (OS) での主なディレクトリとその内容を定めたもの [参照](https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)
[^7]: ホスト名(FQDNの中のドメイン名を除いたもの)とIPアドレスを対応させるためのファイルで、実運用上はほとんど触ることはない [参照](https://linuc.org/study/knowledge/506/)
[^8]: TCPやUDPのポート番号と、そのポートを利用するサービス（あるいはプロトコル名）の情報を対応させるファイル [参照](https://linuc.org/study/knowledge/511/)
[^9]: ファイルシステムや外部記憶媒体を指定のディレクトリにネットワーク経由でつなげること [参照](https://hara-chan.com/it/infrastructure/mount-nfs/)
[^10]: 補助記憶装置の一種で、記録媒体を駆動装置（ドライブ(2)）から容易に取り外すことのできるもののことで、フロッピーディスクやMO、CD-Rやフラッシュメモリーなど [参照](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A0%E3%83%BC%E3%83%90%E3%83%96%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2)
[^11]: Linuxシステムでスケジュールされたジョブを作成できる機能 [参照](https://www.kagoya.jp/howto/rentalserver/cron/) ※詳しく調べること
[^12]: コンピュータ上で実行されているプログラムが、特に何も指定されていない場合に標準的に利用するデータ入力元 [参照](https://e-words.jp/w/%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B.html)
[^13]: 標準入力の反対 [参照](https://e-words.jp/w/%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B.html)