Linux Tips

# sedとxargsでまとめて指定する方法
例えば、以下の変更から「journal」がつくファイルのみのdiffがほしい場合

```bash
$ git status
ブランチ v250-stable
このブランチは 'origin/v250-stable' に比べて397コミット遅れています。fast-forwardすることができます。
  (use "git pull" to update your local branch)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   src/core/systemd.pc.in
        modified:   src/journal-remote/journal-remote-write.c
        modified:   src/journal/journald-server.c
        modified:   src/libsystemd/sd-journal/journal-file.c
        modified:   src/libsystemd/sd-path/sd-path.c
        modified:   src/login/logind.conf.in
        modified:   src/resolve/test-resolved-stream.c
        modified:   src/systemctl/systemd-sysv-install.SKELETON
        modified:   tmpfiles.d/tmp.conf
        modified:   units/meson.build
        modified:   units/proc-sys-fs-binfmt_misc.automount
        modified:   units/systemd-binfmt.service.in
        modified:   units/systemd-udevd.service.in

追跡されていないファイル:
  (use "git add <file>..." to include in what will be committed)
        .pc/
        patches/

no changes added to commit (use "git add" and/or "git commit -a")
```

以下の一番最後のコマンドでパッチが作れる
```bash
# 該当ファイルが３つある
$ git status | grep journal
        modified:   src/journal-remote/journal-remote-write.c
        modified:   src/journal/journald-server.c
        modified:   src/libsystemd/sd-journal/journal-file.c

# modified:をトリミング
$ git status | grep journal | sed "s/modified://"
           src/journal-remote/journal-remote-write.c
           src/journal/journald-server.c
           src/libsystemd/sd-journal/journal-file.c

# ３ファイル分を１行で表示
$ git status | grep journal | sed "s/modified://" | xargs
src/journal-remote/journal-remote-write.c src/journal/journald-server.c src/libsystemd/sd-journal/journal-file.c

# パッチを作る
$ git diff $(git status | grep journal | sed "s/modified://" | xargs) > modified.patch
```

# patchファイルの適応方法
```bash
patch -p(数字) < パッチファイル
```
* -p0：パッチファイル内のパスをそのまま使用
* -p1：パッチファイル内のパスの先頭1つを無視する
* -p2：パスの先頭２つを無視する

# CPU
## 使用してるCPU数が知りたい
```bash
$ lscpu
...(省略)
CPU:                                   20
  オンラインになっている CPU のリスト: 0-19
...(省略)
```
以下でも可能
```bash
$ cat /proc/cpuinfo
```
## 使用するCPU数を変更したい
```bash
$ sudo echo 0 > /sys/devices/system/cpu/cpuX/online
```
cpuXのXは数字で、onlineに0を書き込むと無効、1を書き込むと有効

# 各プロセスのスケジューリングポリシーが知りたい
```bash
$ chrt -p <PID>
```

# installコマンド
ファイルコピー
* ディレクトリが存在しない場合は作成（-D）
* 複数ファイルをコピー（-t）。ワイルドカード使える
* 権限変更（-m）
```bash
$ install -D -t install_dir -m0644 *.txt
```
# grepコマンド
* 一致しないものを検索(-v)

# 指定パスが「/」直下にマウントされてるか確認する方法
```c:sample.c
#include <linux/platform_device.h>
#include <linux/namei.h>

static char *filepath = "/";
module_param(filepath, charp, 0644);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author");
MODULE_DESCRIPTION("A simple example Linux module.");

static int search_path(struct path *pathinfo)
{
	int ret = kern_path(filepath, LOOKUP_FOLLOW, pathinfo);
	if (!ret)
	{
		pr_info("%s:パス取得成功:%d\n", filepath, ret);
	}
	else
	{
		pr_info("%s:パス取得失敗:%d\n", filepath, ret);
	}
	return ret;
}
static int chK_mnt(struct path *pathinfo)
{
	int ret = 0;

	/*
	pathinfo->mntは、指定されたパスのマウント情報を指します。
	pathinfo->mnt->mnt_sbは、そのマウント情報に関連付けられたスーパーブロックを指します。
	pathinfo->mnt->mnt_sb->s_rootは、そのスーパーブロックのルートディレクトリ（マウントポイントのルート）を指します。
	pathinfo->dentryは、指定されたパスのディレクトリエントリを指します。
	*/
	if (pathinfo->mnt->mnt_sb->s_root == pathinfo->dentry)
	{
		pr_info("%s:マウント済\n", filepath);
	}
	else
	{
		ret = -1;
		pr_info("%s:未マウント\n", filepath);
	}
	return ret;
}

static int __init hello_init(void)
{
	struct path pathinfo;
	int ret = search_path(&pathinfo);
	if (!ret)
	{
		chK_mnt(&pathinfo);
	}
	path_put(&pathinfo);
	return 0;
}
static void __exit hello_exit(void)
{
	pr_info("Goodbye!\n");
}

module_init(hello_init);
module_exit(hello_exit);

```

# lsコマンド
```bash
# 縦に並べる「ハイフンイチ」
$ ls -1
```


# 参考
* [Linuxコマンド.NET](https://linuxcommand.net/install/)
* [【Linux】CPUコア数を制限する](https://scienceboy.jp/88io/2022/06/online-cpu/)