hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

stressコマンドの使い方

1 stressコマンドとは?

CPU,ディスク,メモリに負荷をかけるツールです。たとえば、CPU使用率を100%にしたりすることができます。なお、stressコマンドより多くの種類の負荷テストを実行できるstress-ngコマンドというのもあります。stress-ngコマンドについては、stress-ngコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

搭載CPU数を確認します。搭載CPUは4個であることがわかります。

[root@server ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

3 stressコマンドのインストール方法

netcatパッケージはepelリポジトリにあるので、まず、epelリポジトリをインストールします。

[root@server ~]# yum -y install epel-release

次に、stressパッケージをインストールします。

[root@server ~]# yum -y install stress

stress コマンドの版数を確認します。版数は次のとおりです。

[root@server ~]# stress --version
stress 1.0.4

4 オプション一覧

[root@server ~]# stress --help
`stress' imposes certain types of compute stress on your system

Usage: stress [OPTION [ARG]] ...
 -?, --help         show this help statement
     --version      show version statement
 -v, --verbose      be verbose
 -q, --quiet        be quiet
 -n, --dry-run      show what would have been done
 -t, --timeout N    timeout after N seconds
     --backoff N    wait factor of N microseconds before work starts
 -c, --cpu N        spawn N workers spinning on sqrt()
 -i, --io N         spawn N workers spinning on sync()
 -m, --vm N         spawn N workers spinning on malloc()/free()
     --vm-bytes B   malloc B bytes per vm worker (default is 256MB)
     --vm-stride B  touch a byte every B bytes (default is 4096)
     --vm-hang N    sleep N secs before free (default none, 0 is inf)
     --vm-keep      redirty memory instead of freeing and reallocating
 -d, --hdd N        spawn N workers spinning on write()/unlink()
     --hdd-bytes B  write B bytes per hdd worker (default is 1GB)

Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

Note: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).

5 CPUに負荷をかける方法(-c)

5.1 stressプロセスを1つ起動する方法

-cは起動するstressプロセスの個数、-qは起動メッセージを表示しないようにするオプションです。stressプロセスを1つ起動してみます。

[root@server ~]# stress -c 1 -q &
[1] 5119

psコマンドでプロセスの状態を確認すると、子プロセスのCPU使用率が100%であることがわかります(●が親プロセス、★が子プロセス)。親プロセスはwaitシステムコールを実行して、子プロセスの終了を待ちます。したがって、親プロセスのCPU使用率は0%となります。なお、親プロセス、子プロセスともにCPU1で動作していることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,%cpu,psr
COMMAND             PID    PPID %CPU PSR
stress             5119    3195  0.0   1 ●
stress             5120    5119  100   1 ★

子プロセスの状態を確認します。 子プロセスは常にrand()を実行していることがわかります。

[root@server ~]#  ltrace -ttT -p 5120
20:20:26.184179 rand()                                                                      = 708528584 <0.002008>
20:20:26.186668 rand()                                                                      = 834074004 <0.001082>
20:20:26.188304 rand()                                                                      = 1150782216 <0.001273>
-snip-

あと始末をします(stressコマンドの終了)。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 1 -q

5.2 stressプロセスを2つ起動する方法

次に、stressプロセスを2つ起動してみます。

[root@server ~]#  stress -c 2 -q &
[1] 5171

プロセスの状態を確認すると、親プロセスはwaitシステムコールを実行して子プロセスの終了を待っています。したがって、親プロセスのCPU使用率は0%となっています、一方、子プロセスは2個実行していて、各々のCPU使用率は約98%であることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,%cpu,psr
COMMAND             PID    PPID %CPU PSR
stress             5171    3195  0.0   2  ●
stress             5172    5171 98.2   3 ★
stress             5173    5171 98.3   1 ★

あと始末をします。(stressコマンドの終了)。

[root@server ~]# pkill stress
[1]+  Terminated              stress -c 2 -q
[root@server ~]#

6 メモリ獲得/開放の負荷をかける方法(-m)

6.1 メモリ獲得/解放を繰り返す負荷を与える方法(-m <プロセス数>)

-mは獲得するメモリ量を指定するオプションです。このオプションを指定すると、不定サイズのメモリの獲得/解放を繰り返すので、メモリ消費量(psコマンドのrssの値)がある時は30M、またある時は256Mになります(つまり「一定ではない」ということ)。獲得したメモリ量を維持したままにする場合は、--vm-hangオプション(6.2章)を使います。

[root@server ~]# stress -m 1 -q &
[1] 5439

消費メモリ(★印)を確認します。この時点では約140M程度を消費している。

[root@server ~]# ps -C stress -o command,pid,ppid,rss
COMMAND                         PID    PPID   RSS
stress -m 1 -q                 5439    3195  1148
stress -m 1 -q                 5440    5439 140824

適当な時間をおいて、再度psコマンドを実行します。 この時点では約50M程度を消費していることがわかります。

[root@server ~]# ps -C stress -o command,pid,ppid,rss
COMMAND                         PID    PPID   RSS
stress -m 1 -q                 5439    3195  1148
stress -m 1 -q                 5440    5439 50604

6.2 メモリを獲得したままの状態にする方法(--vm-hang)

6.1はメモリの獲得/解放を確認しました。6.2はメモリを獲得したら、そのままの状態を保ちます。 --vm-hangはメモリを獲得したら、そのままの状態を保つ時間(秒)を指定するオプションです。--vm-hang 0 と指定すると、メモリを解放せず獲得したままの状態になります。なお、獲得するメモリ量は256Mです。

[root@server ~]# stress -m 1 --vm-hang 0 -q &
[1] 5645

stressが獲得したメモリ量を確認します。256M獲得したことがわかります(★印)。

[root@server ~]# ps -LC stress -o comm,pid,ppid,rss
COMMAND             PID    PPID   RSS
stress             5645    3195  1152
stress             5646    5645 262560 ★

時間をおいて、再度、psコマンドを実行します。 stressが獲得したメモリ量が256Mのままであることがわかります(★印)。

[root@server ~]#  ps -LC stress -o comm,pid,ppid,rss
COMMAND             PID    PPID   RSS
stress             5645    3195  1152
stress             5646    5645 262560 ★

6.3 指定した量のメモリを獲得したい場合(--vm-bytes <獲得メモリ量>)

--vm-bytesは、指定したメモリ量を獲得するオプションです。--vm-hangオプションと併用することで、指定したメモリ量を解放せずに獲得したままの状態に保つことができます。

64Mのメモリを獲得するstressプロセスを1つ起動します。

[root@server ~]# stress -m 1 --vm-bytes 67108864 --vm-hang 0 -q &
[1] 5834

メモリ使用量を確認してみます。64M(★)獲得していることがわかる。

[root@server ~]# ps -C stress -o command,pid,ppid,rsz,rss
[COMMAND                         PID    PPID   RSZ   RSS
stress -m 1 --vm-bytes 6710    5834    3195  1144  1144
stress -m 1 --vm-bytes 6710    5835    5834 66056 66056 ★

次に、128Mのメモリを獲得するstressプロセスを1つ起動します。

[root@server ~]# stress -m 1 --vm-bytes 134217728 --vm-hang 0 -q &
[2] 5853

メモリ使用量を確認してみます。 1回目に起動しstressプロセスは64M、2回目に起動したstressプロセスは128Mのメモリを獲得したままになっていることがわかります。

[2] 5853
[root@server ~]# ps -C stress -o command,pid,ppid,rsz,rss
COMMAND                         PID    PPID   RSZ   RSS
stress -m 1 --vm-bytes 6710    5834    3195  1144  1144
stress -m 1 --vm-bytes 6710    5835    5834 66056 66056 ★1回目に起動した子プロセス
stress -m 1 --vm-bytes 1342    5853    3195  1056  1056
stress -m 1 --vm-bytes 1342    5854    5853 131808 131808 ★2回目に起動した子プロセス

7 ハードディスクへの書き込み負荷をかける方法(-d,--hdd-bytes)

7.1 hdd-bytesの意味について

--hdd-bytesは、ファイルに書き込むバイト数を指定するオプションです。たとえば、hdd-bytesに5を指定すると、ファイルをオープンして5バイト書き込みます。このとき、ファイルには1バイトづつ書き込んでいきます。書き込みが完了すると、別のファイルをオープンして、同様のことを繰り返します。以下のようにstraceコマンドを使うと、その時の様子がわかります。なお、straceコマンドの使い方は、straceコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# strace -ttT -f stress -d 1 --hdd-bytes 5
-snip-
[pid  2112] 19:03:52.464647 open("./stress.nNJKfS", O_RDWR|O_CREAT|O_EXCL, 0600) = 3 <0.000076>
[pid  2112] 19:03:52.464815 unlink("./stress.nNJKfS") = 0 <0.000030>
[pid  2112] 19:03:52.464903 write(3, "n", 1) = 1 <0.000027>
[pid  2112] 19:03:52.464979 write(3, "{", 1) = 1 <0.000038>
[pid  2112] 19:03:52.465066 write(3, "6", 1) = 1 <0.000017>
[pid  2112] 19:03:52.465130 write(3, "\\", 1) = 1 <0.000060>
[pid  2112] 19:03:52.465259 write(3, "\n", 1) = 1 <0.000028>
[pid  2112] 19:03:52.465369 close(3)    = 0 <0.000068>
[pid  2112] 19:03:52.465516 open("./stress.rp7cxi", O_RDWR|O_CREAT|O_EXCL, 0600) = 3 <0.000123>
[pid  2112] 19:03:52.465729 unlink("./stress.rp7cxi") = 0 <0.000049>
[pid  2112] 19:03:52.465859 write(3, "n", 1) = 1 <0.000099>
[pid  2112] 19:03:52.466051 write(3, "{", 1) = 1 <0.000029>
[pid  2112] 19:03:52.466186 write(3, "6", 1) = 1 <0.000032>
[pid  2112] 19:03:52.466295 write(3, "\\", 1) = 1 <0.000058>
[pid  2112] 19:03:52.466421 write(3, "\n", 1) = 1 <0.000018>
[pid  2112] 19:03:52.466495 close(3)    = 0 <0.000060>
-snip-

7.2実行例

-dオプションを使ってファイルへの書き込みをするプロセスを3つ起動します。 そして、 各プロセスは5バイトの書き込みを繰り返します。 -qは起動メッセージを表示しないオプションです。

[root@server ~]# stress -d 3 --hdd-bytes 5 -q &
[1] 2134

プロセスの状態を確認します。 ●が親プロセス、★が子プロセスです。子プロセスがファイルに書き込みをしていています。 また、親プロセスはCPU3で動作しています。 子プロセスは、それぞれCPU1,CPU2,CPU0で動作しています。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr
COMMAND            PID   PPID PSR
stress            2134   1786   3 ●
stress            2135   2134   1 ★
stress            2136   2134   2 ★
stress            2137   2134   0 ★

pkillコマンドを使って、stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              stress -d 3 --hdd-bytes 5 -q

8 syncの使い方(-i)

-iはsyncを繰り返し実行するプションです。

[root@server ~]# stress -i 1 -q &
[1] 2405

プロセスの状態を確認してみます。 ●は親プロセスです。do_wait カーネル関数を呼び出して、スリープしていることがわかります。

[root@server ~]# ps -C stress -o comm,pid,ppid,psr,wchan
COMMAND            PID   PPID PSR WCHAN
stress            2405   1786   1 do_wait ●
stress            2406   2405   2 -   ★

次にstraceコマンドを使って、子プロセスが何を実行しているかを確認してみます。子プロセスはsyncシステムコールを繰り返し実行していることがわかります。

[root@server ~]# strace -ttT -p 2406
strace: Process 2406 attached
19:32:28.705745 sync()                  = 0 <0.000837>
19:32:28.707012 sync()                  = 0 <0.000574>
19:32:28.707826 sync()                  = 0 <0.000237>
-snip-

pkillコマンドを使って、stressコマンドを終了します。

[root@server ~]# pkill stress
[1]+  Terminated              stress -i 1 -q

9 共通オプションの使い方

9.1 タイムアウトを指定する方法(-t)

-tは指定した時間を経過するとstressコマンドを終了させるオプションです。5秒経過したら、stressコマンドを終了してみます。

[root@server ~]# date;stress -c 1 -q -t 5;date
2021年 12月 20日 月曜日 19:39:43 JST
2021年 12月 20日 月曜日 19:39:48 JST

次は、10秒経過したら、stressコマンドを終了してみます。

[root@server ~]# date;stress -m 1 -q -t 10;date
2021年 12月 20日 月曜日 19:41:55 JST
2021年 12月 20日 月曜日 19:42:05 JST

9.2 dry-runの使い方(-n)

stressコマンドがどのような負荷をかけるかを調べるときに使うオプションです。 実際には、負荷をかけるようなことはしません。

CPU負荷をかけるプロセスを1つ生成してみます。

[root@server ~]# stress -n -c 1
stress: info: [2556] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
stress: info: [2556] successful run completed in 0s

IO負荷をかけるプロセスを2つ生成してみます。

[root@server ~]# stress -n -i 2
stress: info: [2558] dispatching hogs: 0 cpu, 2 io, 0 vm, 0 hdd
stress: info: [2558] successful run completed in 0s

メモリ負荷をかけるプロセスを3つ生成してみます。

[root@server ~]# stress -n -m 3
stress: info: [2561] dispatching hogs: 0 cpu, 0 io, 3 vm, 0 hdd
stress: info: [2561] successful run completed in 0s

HDD負荷をかけるプロセスを4つ生成してみます。

[root@server ~]# stress -n -d 4
stress: info: [2573] dispatching hogs: 0 cpu, 0 io, 0 vm, 4 hdd
stress: info: [2573] successful run completed in 0s

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

findコマンドの使い方

1. findコマンドとは

ファイルやディレクトリを検索するコマンドです。

2. 検証環境

CentOS版数は次のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は次のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 ファイルタイプで検索する方法(-type)

3.1 通常ファイルを検索する方法(f)

カレントディレクトリ配下の通常ファイルを検索してみます。

[root@server ~]# find . -type f
-snip-

3.2 ディレクトリを検索する方法(d)

カレントディレクトリ配下のディレクトリを検索してみます。

[root@server ~]# find . -type d
-snip-

3.3 名前付きパイプを検索する方法(p)

/run配下の名前付きパイプを検索してみます。

[root@server ~]# find /run -type p
/run/initctl
/run/dmeventd-client
/run/dmeventd-server
-snip-

ファイルタイプを確認してみます。名前付きパイプであることがわかります。

[root@server ~]# file /run/initctl
/run/initctl: fifo (named pipe)

3.4 ソケットを検索する方法(s)

/run配下のソケットを検索してみます。

[root@server ~]# find /run -type s
/run/gssproxy.sock
/run/chrony/chronyd.sock
-snip-

ファイルタイプを確認してみます。ソケットであることがわかります。

[root@server ~]# file /run/gssproxy.sock
/run/gssproxy.sock: socket

3.5 シンボリックリンクを検索する方法(l)

/usr/sbin配下のシンボリックリンクを検索してみます。

[root@server ~]#  find /usr/sbin -type l
/usr/sbin/iptables-restore-translate
/usr/sbin/mkfs.msdos
/usr/sbin/mkfs.vfat
/usr/sbin/vigr
-snip-

ファイルタイプを確認してみます。シンボリックリンクであることがわかります。

[root@server ~]# file /usr/sbin/iptables-restore-translate
/usr/sbin/iptables-restore-translate: symbolic link to xtables-nft-multi
[root@server ~]# ls -l /usr/sbin/iptables-restore-translate
lrwxrwxrwx. 1 root root 17  8月 18  2020 /usr/sbin/iptables-restore-translate -> xtables-nft-multi

4 ユーザで検索する方法(-user)

/var配下のディレクトリにおいて、apacheユーザが所有するファイルを検索してみます。

[root@server ~]# find /var -user apache
/var/lib/dav
/var/lib/httpd
/var/cache/httpd
/var/cache/httpd/proxy
/var/cache/httpd/ssl

ファイルの詳細を確認してみます。apacheユーザが所有していることがわかります。

[root@server ~]# ls -ld /var/lib/dav
drwx------. 2 apache apache 6 11月  4  2020 /var/lib/dav

5 パーミッションで検索する方法(-perm)

ファイルのパーミッションが755であるものを検索します。

[root@server ~]# find /usr/bin -perm 755
/usr/bin/trust
/usr/bin/catchsegv
/usr/bin/setxkbmap
-snip-

ファイルのパーミッションを確認します。 パーミッションが755であることがわかります。

[root@server ~]# ls -l /usr/bin/trust
-rwxr-xr-x. 1 root root 239200  7月  2  2019 /usr/bin/trust

6 サイズで検索する方法(-size)

6.1 サイズを指定する方法

事前準備として、1024バイトと2048バイトのファイルを作成します。ファイルの作成方法は、ファイルの作り方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]#  mkdir /test
[root@server ~]# fallocate -l 1024 /test/1024.dat
[root@server ~]# fallocate -l 2048 /test/2048.dat

作成したファイルのファイルサイズとinode番号を確認します。 なお、inode番号は左端の値になります。

[root@server ~]# ls -li /test/
合計 8
19026495 -rw-r--r--. 1 root root 1024 12月 19 11:46 1024.dat
19026497 -rw-r--r--. 1 root root 2048 12月 19 11:46 2048.dat

1024(byte)のファイルを検索してみます。

[root@server ~]# find /test -size 1024c
/test/1024.dat

2(Kbyte)のファイルを検索してみます。

[root@server ~]#  find /test -size 2k
/test/2048.dat

1024バイトより大きいファイルを検索してみます。

[root@server ~]# find /test -size +1024c
/test/2048.dat

2048バイトより小さいファイルを検索してみます。 /testディレクトのサイズが38バイトなので、/testディレクトリも表示されています。

[root@server ~]#  find /test -size -2048c
/test
/test/1024.dat

/testディレクトのサイズは、以下のとおり38バイトです。

[root@server ~]# ls -ld /test
drwxr-xr-x. 2 root root 38 12月 19 11:46 /test

ファイルサイズが1000バイトより大きく、2000バイト未満のファイルを検索してみます。

[root@server ~]# find /test -size +1000c -size -2000c
/test/1024.dat

7 時間で検索する方法

7.1 分で検索する方法(-mmin)

ファイルのタイムスタンプを確認します。

[root@server ~]# ls --full-time /test/*dat
-rw-r--r--. 1 root root 1024 2021-12-19 11:46:21.208788721 +0900 /test/1024.dat
-rw-r--r--. 1 root root 2048 2021-12-19 11:46:26.735847371 +0900 /test/2048.dat

現在の時刻を確認します。

[root@server ~]# date
2021年 12月 19日 日曜日 17:44:24 JST

5分以上前に更新したファイルを検索します。 テスト用に作成したファイル見つかりました。

[root@server ~]# find /test -mmin +5
/test
/test/1024.dat
/test/2048.dat

5分以内に更新したファイルを検索します。 検索結果になにも表示されないことがわかります。

[root@server ~]# find /test -mmin -5
[root@server ~]#

7.2 日で検索する方法(-mtime)

1日以内に更新したファイルを検索します。 テスト用に作成したファイルが見つかったことがわかります。

[root@server ~]# find /test -mtime -1
/test
/test/1024.dat
/test/2048.dat

1日より前に更新したファイルを検索してみます。 そのようなファイルは無いことがわります。

[root@server ~]# find /test -mtime +1
[root@server ~]#

7.3 指定した日時より新しいファイルを検索する方法(-newer )

テスト用のファイルを確認します。

[root@server ~]# ls --full-time /test/*
-rw-r--r--. 1 root root 1024 2021-12-19 11:46:21.208788721 +0900 /test/1024.dat
-rw-r--r--. 1 root root 2048 2021-12-19 11:46:26.735847371 +0900 /test/2048.dat

1024.datより新しいタイムスタンプのファイルを検索してみます。

[root@server ~]# find /test -newer /test/1024.dat
/test
/test/2048.dat
/test/4096.dat

次に、2048.datより新しいタイムスタンプのファイルを検索してみます。

[root@server ~]# find /test -newer /test/2048.dat
/test
/test/4096.dat

8 パターンで検索する方法

8.1 指定したパターンで検索する方法

テスト用ファイルを作成します。

[root@server ~]# fallocate -l 4096 /test/4096.DAT

テスト用ファイルを確認します。

[root@server ~]# ls -l /test/*
-rw-r--r--. 1 root root 1024 12月 19 11:46 /test/1024.dat
-rw-r--r--. 1 root root 2048 12月 19 11:46 /test/2048.dat
-rw-r--r--. 1 root root 4096 12月 19 18:49 /test/4096.DAT

拡張子がdatのファイルを検索してみます。

[root@server ~]# find /test -name "*.dat"
/test/1024.dat
/test/2048.dat

拡張子がDATのファイルを検索してみます。

[root@server ~]# find /test -name "*.DAT"
/test/4096.DAT

大文字、小文字を区別しないで拡張子datのファイルを検索してみます。

[root@server ~]# find /test -iname "*.dat"
/test/1024.dat
/test/2048.dat
/test/4096.DAT

9 条件を絞り込む方法

9.1 事前準備

テスト用のファイルを作成します。

[root@server ~]# mkdir /test
[root@server ~]# touch /test/1024.dat
[root@server ~]# touch /test/2048.dat
[root@server ~]# touch /test/4096.DAT
[root@server ~]# touch /test/test.sh
[root@server ~]# chmod 755 /test/test.sh

作成したファイルを確認します。

[root@server ~]# ls -l /test/*
-rw-r--r--. 1 root root 0 12月 21 19:06 /test/1024.dat
-rw-r--r--. 1 root root 0 12月 21 19:06 /test/2048.dat
-rw-r--r--. 1 root root 0 12月 21 19:06 /test/4096.DAT
-rwxr-xr-x. 1 root root 0 12月 21 19:06 /test/test.sh

9.2 否定で絞り込む方法(!)

1024.dat以外のファイルを検索してみます。

[root@server ~]# find /test ! -name "1024.dat"
/test
/test/2048.dat
/test/4096.DAT
/test/test.sh

拡張子がdat以外のファイルを検索してみます。

[root@server ~]# find /test ! -name "*.dat"
/test
/test/4096.DAT
/test/test.sh

9.3 or条件で絞り込む方法(-o)

拡張子がdatまたはshのファイルを検索してみます。

[root@server ~]# find /test -name "*.dat" -o -name "*.sh"
/test/1024.dat
/test/2048.dat
/test/test.sh

拡張子がdatまたはDATのファイルを検索してみます。

[root@server ~]# find /test -name "*.dat" -o -name "*.DAT"
/test/1024.dat
/test/2048.dat
/test/4096.DAT

9.4 and条件で絞り込む方法(-a)

拡張子がsh、かつ、1日以内のタイムスタンプのファイルを検索してみます。

[root@server ~]# find /test -name "*.sh" -a -mtime -1
/test/test.sh

拡張子がsh、かつ、1日以前のタイムスタンプのファイルを検索してみます。

[root@server ~]# find /test -name "*.sh" -a -mtime +1
[root@server ~]#

10 検索するディレクトリの深さを指定する方法

10.1 事前準備

テスト用のファイルを作成します。

[root@server ~]# mkdir -p /test1/test2/test3/
[root@server ~]# touch /test1/test1.dat
[root@server ~]# touch /test1/test2/test2.dat
[root@server ~]# touch /test1/test2/test3/test3.dat

作成したファイルを確認してみます。

[root@server ~]# ls -lR /test1
/test1:
合計 0
-rw-r--r--. 1 root root  0 12月 21 19:11 test1.dat
drwxr-xr-x. 3 root root 36 12月 21 19:11 test2

/test1/test2:
合計 0
-rw-r--r--. 1 root root  0 12月 21 19:11 test2.dat
drwxr-xr-x. 2 root root 23 12月 21 19:11 test3

/test1/test2/test3:
合計 0
-rw-r--r--. 1 root root 0 12月 21 19:11 test3.dat

10.2 指定したディレクトリの深さまで検索する方法(-maxdepth)

2つ下までのディレクリを検索してみます。

[root@server ~]# find /test1 -maxdepth 3 -name "*.dat"
/test1/test2/test3/test3.dat
/test1/test2/test2.dat
/test1/test1.dat

次に、1つ下までのディレクリを検索してみます。

[root@server ~]# find /test1 -maxdepth 2 -name "*.dat"
/test1/test2/test2.dat
/test1/test1.dat

カレントディレクトリのファイルを検索してみます。

[root@server ~]# find /test1 -maxdepth 1 -name "*.dat"
/test1/test1.dat

10.3 指定したディレクトリより深い位置の検索方法(-mindepth )

カレントディレクトリ配下のファイルを検索してみます。

[root@server ~]# find /test1 -mindepth 1 -name "*.dat"
/test1/test2/test3/test3.dat
/test1/test2/test2.dat
/test1/test1.dat

1つ下のディレクトリ配下のファイルを検索してみます。

[root@server ~]# find /test1 -mindepth 2 -name "*.dat"
/test1/test2/test3/test3.dat
/test1/test2/test2.dat

2つ下のディレクトリ配下のファイルを検索してみます。

[root@server ~]# find /test1 -mindepth 3 -name "*.dat"
/test1/test2/test3/test3.dat

3つ下のディレクトリ配下のファイルを検索してみます。

[root@server ~]# find /test1 -mindepth 4 -name "*.dat"
[root@server ~]#

11 アクションの使い方

11.1 事前準備

テスト用のファイルを作成します。

[root@server ~]# mkdir /test
[root@server ~]# fallocate -l 1024 /test/1024.dat
[root@server ~]# fallocate -l 2048 /test/2048.dat
[root@server ~]# fallocate -l 4096 /test/4096.DAT
[root@server ~]# touch /test/zero.dat

作成したファイルを確認します。

[root@server ~]# ls --full-time /test
合計 12
-rw-r--r--. 1 root root 1024 2021-12-21 19:33:04.393812496 +0900 1024.dat
-rw-r--r--. 1 root root 2048 2021-12-21 19:33:08.085837884 +0900 2048.dat
-rw-r--r--. 1 root root 4096 2021-12-21 19:33:11.796863418 +0900 4096.DAT
-rw-r--r--. 1 root root    0 2021-12-21 19:33:15.318887630 +0900 zero.dat

11.2 日時を表示する方法

拡張子がdatのファイルについて、日時を表示してみます。 %pはファイル名、%TY-%Tm-%Td %TH:%TM:%TSは日時、%Tzはタイムゾーンを表します。

[root@server ~]# find /test -name "*.dat" -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"
/test/1024.dat 2021-12-21 19:33:04.3938124960 +0900
/test/2048.dat 2021-12-21 19:33:08.0858378840 +0900
/test/zero.dat 2021-12-21 19:33:15.3188876300 +0900

11.3 サイズを表示する方法

%pはファイル名、%sはファイルサイズを表します。

[root@server ~]# find /test -name "*.dat" -printf "%p %s\n"
/test/1024.dat 1024
/test/2048.dat 2048
/test/zero.dat 0

11.4 出力形式の使い方(-ls)

検索で見つけたファイルをls -dilsと同じ形式で表示します。

[root@server ~]# ls -dils /test/*
44057723 4 -rw-r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat
44057724 4 -rw-r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat
44057725 4 -rw-r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT
44057726 0 -rw-r--r--. 1 root root    0 12月 21 19:33 /test/zero.dat

拡張子がdatのファイルについて、ls -dilsと同じ形式で表示してみます。

[root@server ~]# find /test -name "*.dat" -ls
44057723    4 -rw-r--r--   1 root     root         1024 12月 21 19:33 /test/1024.dat
44057724    4 -rw-r--r--   1 root     root         2048 12月 21 19:33 /test/2048.dat
44057726    0 -rw-r--r--   1 root     root            0 12月 21 19:33 /test/zero.dat

11.5 ファイルを削除する方法(-delete)

サイズが0のファイルを削除してみます。

[root@server ~]# find /test -empty -delete

ファイルを確認してみます。サイズが0のファイルが削除されたことがわかります。

[root@server ~]# ls -l /test/*
-rw-r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat
-rw-r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat
-rw-r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT

11.6見つけたファイルに対してコマンドを実行する方法(-exec)

テスト用ファイルのパーミッションを確認します。

[root@server ~]# ls -l /test/*
-rw-r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat
-rw-r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat
-rw-r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT

拡張子がdatまたはDATのファイルについて、実行権を644から444に変更してみます。 {}は引数、最後は;を指定します。;をメタキャラと解釈されないように\でエスケープします。

[root@server ~]# find /test -iname "*.dat" -exec chmod 444 {} \;

ファイルのパーミッションを確認します。 パーミッションが644から444に変更されたことがわかります。

[root@server ~]# ls -l /test/*
-r--r--r--. 1 root root 1024 12月 21 19:33 /test/1024.dat
-r--r--r--. 1 root root 2048 12月 21 19:33 /test/2048.dat
-r--r--r--. 1 root root 4096 12月 21 19:33 /test/4096.DAT

12 特殊なファイルアクセス権(setuid,setgid,stickyビット)を持ったファイルの検索方法

12.1 setuidがセットされたファイルの検索方法

[root@server ~]# find /usr/bin -perm /4000 -ls
50559807   32 -rwsr-xr-x   1 root     root        32096 10月 31  2018 /usr/bin/fusermount
50787905   44 -rwsr-xr-x   1 root     root        41936  8月  9  2019 /usr/bin/newgrp
-snip-

12.2 setgidがセットされたファイルの検索方法

[root@server ~]# find /usr/bin -perm /2000 -ls
50555809   16 -r-xr-sr-x   1 root     tty         15344  6月 10  2014 /usr/bin/wall
50873740   20 -rwxr-sr-x   1 root     tty         19544 10月  1  2020 /usr/bin/write
-snip-

12.3 stickyビットがセットされたファイルの検索方法

[root@server ~]# find /tmp -perm /1000 -ls
16777288    4 drwxrwxrwt  11 root     root         4096 12月 21 19:23 /tmp
16879979    0 drwxrwxrwt   2 root     root            6 11月  9 20:26 /tmp/.XIM-unix
-snip-

13 条件に合致したファイルを削除する方法(-delete)

13.1 事前準備

ファイルを3つ作成します。 なお、以下の{a..c}はbashのブレース展開という機能を使っています。

[root@server ~]# mkdir /test
[root@server ~]# touch /test/{a..c}.txt

作成したファイルを確認します。

[root@server ~]# ls /test/*.txt
/test/a.txt  /test/b.txt  /test/c.txt

13.2 条件に合致したファイルの削除

a.txtファイルを削除します。

[root@server ~]# find /test -name a.txt -delete

ファイルを確認します。a.txtファイルが削除されたことがわかります。

[root@server ~]# ls /test/*.txt
/test/b.txt  /test/c.txt

次に、b.txtファイルを削除します。

[root@server ~]# find /test -name b.txt -delete

ファイルを確認します。b.txtファイルが削除されたことがわかります。

[root@server ~]# ls /test/*.txt
/test/c.txt

最後にc.txtファイルを削除します。

[root@server ~]# find /test -name c.txt -delete

ファイルを確認します。c.txtファイルが削除されたことがわかります。

[root@server ~]# ls /test/*.txt
ls: /test/*.txt にアクセスできません: そのようなファイルやディレクトリはありません

14 実行ファイルを見つける方法

14.1 事前準備

テスト用のファイルを作成します。

[root@server ~]# mkdir /test
[root@server ~]# touch /test/file1
[root@server ~]# touch /test/file2
[root@server ~]# touch /test/file3
[root@server ~]# touch /test/file4
[root@server ~]# chmod 100 /test/file1
[root@server ~]# chmod 010 /test/file2
[root@server ~]# chmod 001 /test/file3

作成したファイルのパーミッションを確認します。 ファイルfile4以外は実行ファイルであることがわかります。

[root@server ~]# ls -l /test/
合計 0
---x------. 1 root root 0 12月 21 19:23 file1
------x---. 1 root root 0 12月 21 19:23 file2
---------x. 1 root root 0 12月 21 19:23 file3
-rw-r--r--. 1 root root 0 12月 21 19:23 file4

14.2 executableを使う方法

executableを使って、実行ファイルのみ検索してみます。

[root@server ~]# find /test/ -type f -executable
/test/file1
/test/file2
/test/file3

14.3 permを使う方法

パーミッションが100のファイルを検索してみます。

[root@server ~]# find /test/ -type f -perm 100
/test/file1

パーミッションが010のファイルを検索してみます。

[root@server ~]# find /test/ -type f -perm 010
/test/file2

パーミッションが001のファイルを検索してみます。

[root@server ~]# find /test/ -type f -perm 001
/test/file3

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

ncコマンドの使い方(ネットワーク実験の幅が広がるなぁ~)旧版

元記事を「はてな記法」に変更するた、あらたに記事を作成しました。内容に変更はありません。 ncコマンドの使い方(ネットワーク実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログ

ファイルの作り方

1 はじめに

各種方法でファイルを作成してみます。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-957.el7.x86_64

3 touchによるファイル作成

3.1 最も簡単な使い方

[root@server ~]# touch test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 0  5月  6 19:22 test.dat

3.2 ファイルの作成日時を指定する方法(-d)

現在日時を確認する。

[root@server ~]# date
2019年  5月  6日 月曜日 20:26:44 JST

10年前の日付のファイルを作成する。

[root@server ~]# touch -d "2009/5/6 00:00:00" test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 0  5月  6  2009 test.dat

本日の日付をファイル名の一部につける方法

[root@server file]# touch test-`date +%Y%m%d`.dat
[root@server file]# ls
test-20190507.dat

4 headによるファイル作成

10バイトのファイルを作成してみます。

[root@server ~]# head -c 10 /dev/zero > test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 10  5月  6 19:24 test.dat

1Kバイトのファイルを作成してみます。

[root@server ~]# head -c 1k /dev/zero > test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 1024  5月  6 19:27 test.dat

1Mバイトのファイルを作成してみます。

[root@server ~]# head -c 1m /dev/zero > test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 1048576  5月  6 19:26 test.dat

1Gバイトのファイルを作成してみます。

[root@server ~]# head -c 1G /dev/zero > test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 1073741824  5月  6 19:28 test.dat

5 fallocateによるファイル作成

10バイトのファイルを作成してみます。

[root@server ~]# fallocate -l 10 test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 10  5月  6 19:31 test.dat

1Kバイトのファイルを作成してみます。

[root@server ~]# fallocate -l 1K test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 1024  5月  6 19:32 test.dat

1Mバイトのファイルを作成してみます。

[root@server ~]# fallocate -l 1M test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 1048576  5月  6 19:32 test.dat

1Gバイトのファイルを作成してみます。

[root@server ~]# fallocate -l 1G test.dat
[root@server ~]# ls -l test.dat
-rw-r--r--. 1 root root 1073741824  5月  6 19:33 test.dat

6 truncateによるファイル作成

10バイトのファイルを作成してみます。

[root@server file]# truncate -s 10 test.dat
[root@server file]# ls -l test.dat
-rw-r--r--. 1 root root 10  5月  6 20:10 test.dat

1Kバイトのファイルを作成してみます。

[root@server file]# truncate -s 1K test.dat
[root@server file]# ls -l test.dat
-rw-r--r--. 1 root root 1024  5月  6 20:11 test.dat

1Mバイトのファイルを作成してみます。

[root@server file]# truncate -s 1M test.dat
[root@server file]# ls -l test.dat
-rw-r--r--. 1 root root 1048576  5月  6 20:12 test.dat

1Gバイトのファイルを作成してみます。

[root@server file]# truncate -s 1G test.dat
[root@server file]# ls -l test.dat
-rw-r--r--. 1 root root 1073741824  5月  6 20:12 test.dat

7 mktempによるファイル作成

7.1 引数なしで実行する方法

引数なしでmktempを実行すると、/tmpにユニークな名前のファイルが作成されます。

[root@server file]# mktemp
/tmp/tmp.HDtemULeBT
[root@server file]# ls -l /tmp/tmp.HDtemULeBT
-rw-------. 1 root root 0  5月  6 19:48 /tmp/tmp.HDtemULeBT

7.2 ディレクトを指定する方法

/test配下にユニークな名前のファイルを作成してみます。

[root@server ~]# mkdir /test
[root@server ~]# mktemp --tmpdir=/test
/test/tmp.mX10XnDlDN

[root@server ~]# ls -l /test/tmp.mX10XnDlDN
-rw-------. 1 root root 0  5月  6 19:55 /test/tmp.mX10XnDlDN

8 bashのブレース展開によるファイル作成

8.1 単純な方法

[root@server file]# touch test_{1..10}.dat
[root@server file]# ls -l
合計 0
-rw-r--r--. 1 root root 0  5月  6 19:39 test_1.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_10.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_2.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_3.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_4.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_5.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_6.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_7.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_8.dat
-rw-r--r--. 1 root root 0  5月  6 19:39 test_9.dat

8.2 桁をそろえる方法

[root@server file]# touch test_{01..10}.dat
[root@server file]# ls -l
合計 0
-rw-r--r--. 1 root root 0  5月  6 19:38 test_01.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_02.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_03.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_04.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_05.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_06.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_07.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_08.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_09.dat
-rw-r--r--. 1 root root 0  5月  6 19:38 test_10.dat

8.3 アルファベットと組み合わせる方法

[root@server file]# touch test_{1..3}-{a..c}.dat
[root@server file]# ls -l
合計 0
-rw-r--r--. 1 root root 0  5月  6 19:40 test_1-a.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_1-b.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_1-c.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_2-a.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_2-b.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_2-c.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_3-a.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_3-b.dat
-rw-r--r--. 1 root root 0  5月  6 19:40 test_3-c.dat

9 スパースファイルの作成方法

9.1 truncateで作る方法

1Gバイトのファイルを作成してみます。 ファイルサイズは1Gであることがわかります。

[root@server file]# truncate -s 1G test.dat
[root@server file]# ls -l test.dat
-rw-r--r--. 1 root root 1073741824  5月  6 20:16 test.dat

ファイルが消費しているディスク量を確認してみます。 ファイルサイズは1Gですが、実際にファイルが消費している ディスク量は0バイトであることがわかります。

[root@server file]# du test.dat
0       test.dat

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ