2025/1/6 学習記録

## 現状：
エンジニアへの未経験転職。
就職先もほぼ決まり、2月からひよこエンジニアに。

2025年は頑張ろうということで、2025年学習記録6日目。

内容は常に書き散らしのメモです、あしからず。

当面の目標：LPIC101,102合格

## select文を用いたファイル操作
- `select`文では、実行すると`in` に指定した値に番号が割り振られる。
```
#!/bin/bash

select command in "list" "delete" "rename" "show" "exit"
do
  case $command in 
  "list" )
    ls;;
  "delete" )
    ls
    read -p "Enter file name you eant to delete: " file_name
    if [ -f $file_name ];
    then
      rm $file_name
    fi;;
  "rename" )
    ls
    read -p "Enter file name you want to rename: " file_name
    read -p "Enter new fole name: " new_file_name
    if [ -f $file_name ];
    then
      mv $file_name $new_file_name
    fi;;
  "show" )
    ls
    read -p "Enter file name you want to look: " file_name
    cat $file_name;;
  "exit" )
    break;;
  esac
done
```
実行例
```
1) list
2) delete
3) rename
4) show
5) exit
#? 
```
上記の場合、`#?` でどれを選択するか聞かれているので
1~5の番号を入力するとそれに従った処理が実行される。




## ファイルの実行によってアプリが全て落ちる

```
#!/bin/bash

if [ $# -ne 1 ];
then
  echo 'argument is wrong'
  exit 1
fi

function stop_exam7() {
  rm exam7.lock
  exit 0
}

if [ $1 = 'start' ];
then
  if [ -f 'exam7.lock' ];
  then
    echo 'Process is already runnning'
    exit 0
  else
    echo $$ > exam7.lock
    trap "stop_exam7" 2 15
    for i in `seq 1 1000`;
    do
      echo $i >> output_$$.txt
      sleep 1
    done
    rm exam7.lock
    exit 0
  fi
elif [ $1 = 'stop' ];
then
  if [ -f 'exam7.lock' ];
  then
    PID=-1
    while read p;
    do
      PID=$p
    done < 'exam7.lock｀'
    kill -15 $PID
  else
    echo 'Process is not running'
    exit 0
  fi
elif [ $1 = 'status' ];
then
  if [ -f 'exam7.lock' ];
  then
    PID=-1
    while read p;
    do
      PID=$p
    done < 'exam7.lock'
    echo Process is running pid=$PID
  else
    echo 'Process is not running'
  fi
else
  echo 'wrong argument'
  exit 1
fi
```
上記コードの下記部分でタイポ有り。
```bash
done < 'exam7.lock｀'
```

このタイポによって、

- ループの最後のPIDだけが保持され、ファイル内に複数のPIDがある場合、最後のPIDのみが`$PID`変数に格納。

- `exam7.lock`ファイルが存在しない、または正しく読み取れない場合、
`$PID`変数が-1のままとなり、`kill -15 $PID`コマンドが`kill -15 -1`として実行

- `kill -15 -1`は、現在のユーザーが所有する**すべてのプロセス**に対してSIGTERMシグナルを送信するため、様々なアプリケーションが強制終了された。



## `kill`コマンド

Linuxやmacなどのシステムで実行中のプロセスを終了させるために使用されるコマンド。

### 基本的な機能

- プロセスIDを指定して、特定のプロセスにシグナルを送信します[1][2]。
- デフォルトでは、TERMシグナル（シグナル番号15）を送信し、プロセスに終了を要求します[2]。

### 主なオプションとシグナル

- **s**: 特定のシグナルを指定して送信します[1]。
- **l**: シグナル名とシグナル番号の対応を表示します[1]。

主なシグナルには以下があります：

| シグナル名 | 番号 | 機能 |
| --- | --- | --- |
| SIGTERM | 15 | 終了 |
| SIGKILL | 9 | 強制終了 |
| SIGHUP | 1 | 再起動 |
| SIGSTOP | 17 | 停止 |

### `SIGTERM`

プロセスに対して終了を要求するシグナル。

### 特徴と挙動

1. シグナル番号は15です[1][4]。
2. プロセスに対して適切な方法で終了するよう要求します[4]。
3. killコマンドのデフォルトシグナルとして使用されます[2]。
4. プロセスは終了処理を実行できる機会が与えられます[2]。
5. プログラムにSIGTERMのハンドラーがある場合、終結処理を行って秩序正しく終了することができます[2]。
6. アプリケーションによっては、SIGTERMを受信しても実際には終了しない場合があります[2]。
7. SIGKILLとは異なり、プロセスがこのシグナルを捕捉し、必要な終了処理を実行することができます[1]。
8. 多くのデーモンプログラムでは、SIGTERMを受信すると、子プロセスの終了処理や一時ファイルの削除などのクリーンアップ処理を行ってから終了します[1]。

### Citations:

[1] https://qiita.com/Kernel_OGSun/items/e96cef5487e25517a576
[2] https://www.ibm.com/docs/ja/aix/7.2?topic=management-process-termination
[3] https://qiita.com/toshihirock/items/bc6a9a4091afa9bb61f1
[4] https://qiita.com/dingtianhongjie/items/3469d147152d929d7bff
[5] https://ascii.jp/elem/000/001/467/1467705/
[6] https://pawsole.com/kill/
[7] [https://ja.wikipedia.org/wiki/シグナル_(Unix)](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB_(Unix))
[8] https://docs.oracle.com/cd/E19253-01/819-0379/eoizf/index.html

### 使用例

1. プロセスを通常終了させる：
    
    ```
    kill PID
    ```
    
2. プロセスを強制終了させる：
    
    ```
    kill -9 PID
    ```
    
3. 複数のプロセスを同時に終了させる：
    
    ```
    kill PID1 PID2 PID3
    ```
    

### 注意点

- SIGKILLシグナルは、プロセスが無視できない強制終了シグナルです[2]。
- 通常は、まずSIGTERMを試し、それが効かない場合にSIGKILLを使用することが推奨されます。

### Citations:

[1] https://uxmilk.jp/50638
[2] https://pawsole.com/kill/
[3] https://codezine.jp/unixdic/w/kill
[4] https://atmarkit.itmedia.co.jp/ait/articles/1604/05/news022_2.html
[5] https://docs.oracle.com/cd/E19455-01/806-2668/processmanagerusing-62/index.html
[6] https://www.miraiserver.ne.jp/column/linux_process/


## `kill -1`コマンドによって再起動されたもの
# `/sbin/launchd`
- macOSの中核となるシステムプロセス。

### 主な機能

1. システム起動管理：
   - macOSの起動時に最初に実行されるプロセスです[1][2]。
   - カーネルの直後に立ち上がり、プロセスID (PID) は0か1です[1]。

2. サービス管理：
   - 他のデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行います[2]。
   - システムサービスやユーザーレベルのサービスを管理します。

3. オンデマンド起動：
   - 必要に応じてサービスを起動し、不要なときは停止させます[1]。

4. 監視機能：
   - 実行中のサービスを監視し、必要に応じて再起動します[2]。

### 特徴

- **継続的実行**: バックグラウンドで常に動作し、システムの安定性を維持します[1]。

- **リソース効率**: 多くの場合、リソースの使用量は最小限に抑えられています[1]。

- **設定管理**: `.plist`ファイルを使用して、サービスの設定を管理します[3]。

### 関連ツール

- **launchctl**: launchdを制御するためのコマンドラインツールです[2]。
- **LaunchControl**: launchdの管理を容易にするGUIツールです[4]。

launchdは、macOSの自動化や定期的なタスク実行に非常に有用なツールであり、従来のcronに代わる現代的なソリューションとして位置づけられています[4][5]。

Citations:
[1] https://macpaw.com/ja/how-to/launchd-process-mac
[2] https://ja.wikipedia.org/wiki/Launchd
[3] https://dev.classmethod.jp/articles/mac-launch-agents/
[4] https://qiita.com/nori3tsu/items/39cf1ca8ca779f9d074f
[5] https://ai.hack-le.com/mac-launchd/

---

### タイポ一つでこんなことが発生することに恐怖を覚えた。


### 今日はここまで！