いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.279 / 読者数:2824名

こんばんは、うすだです。

自分がアラフィフだからかもしれませんが、最近、40〜60代や、 定年後の生き方に関する本がやたらと目に付きます。

ちょっと気になったので、某アマゾンで、「50歳 定年」で検索して出てきた書籍や雑誌、 ムックの数を数えてみました。結果がこちらです。

2018年2017年2016年2015年 2014年2013年2012年2011年2010年
914969 7711

2009年以前もありますが、だいたい年1冊程度なので、割愛します。

で、去年から急に増えているように思います。
特に、2018年7〜8月は、2ヶ月で7冊も発売されていました。

おそらく、団塊ジュニア世代(1971〜1973年生まれの世代) が50歳になろうとしているからではないか、と思っております。

それだけ仲間、あるいはライバルがたくさんいるということだ、と解釈をして、 50代以降もがんばっていかねばと思いました。

…と、ここまで書いた後、一昨日に本屋さんへ寄ったところ、 7冊どころかもっとたくさんの定年本や50代本がありました。

やはり、現場に足を運んで調べることも必要ではないか、と思いました。
本屋が現場なのか? という気もいたしますが…。

老後だけでなく、経年劣化も気になるところではありますが、いまは心に蓋をして、 はりきってまいろうかと思います。

今回のお題 - xargs でまとめて処理する (レベル:初級)

ここ3回(3ヶ月)、Kubernetesに関連するネタをご紹介してきました。

今回、その集大成、と言ったら大げさですが、 複数マシンで環境を作って動かして締めようと思っていたのですが、 発行日である本日の夜を迎えたいま現在、 天晴と言ってしまいたくなるほど動いておりません。

そこで今回は、まったく別のネタでしのいでしまおうと思います。

誠に申し訳ございませんが、ご了承いただけますとたいへん幸いです。

 

さて、ここ数年、たくさんのデータを扱うお仕事を、それなりに担当しております。

ある形式のデータファイルを読み込んでデータベースに登録したり、 形式を変えて保存したり、それらが問題なく処理されたか確認したりと、 やることはたくさんあります。

しかし、できることならなるべく簡単に、 大げさに言うとなるべく自動化して楽をしたいと思うのが、 人間というものではないでしょうか。

という訳で今回は、Kubernetesとは接点のなさそうな、 xargs コマンドの使用方法などをご紹介したいと思います。

最初にカミングアウトしておきますが、実は、xargs を普段あまり使っておりません。 sh のループ(for とか while とか)や find やそれらの組み合わせでなんとかしていました。

今回、あらためて調べ直してみました。何卒よろしくお願いいたします。

まずは xargs の概要から

xargs コマンドは、標準入力またはファイルから読み込んだ文字列を引数にして、 指定したコマンドを実行します。

かなり標準的なコマンドのため、 たいていのUNIX系OSには標準で存在するものと思います。
Debian や RedHat 系のディストリビューションでは、 GNUプロジェクトの「findutils」に含まれるものを使っています。

findutils - Summary
http://savannah.gnu.org/projects/findutils/

たとえば、各ユーザのホームディレクトリの状態を確認したい場合、 以下のように実行することで、その目的を達成できます。

  $ cut -d : -f 6 /etc/passwd | xargs ls -ld

やっていることは、以下と変わりません。

  $ ls -ld $(cut -d : -f 6 /etc/passwd)

ですが、xargs を使うと、引数が多すぎる(引数の数が getconf ARG_MAX で得られる数を超えている)場合に分割して実行してくれたり、 複数同時にコマンドを実行してくれたりします。

そのあたりを踏まえた使い方を、ご紹介していきたいと思います。

xargs の使い方を淡々と…

xargs を普通に実行すると、標準入力の文字列が、 コマンドの引数へ一気に渡されます。
ですが、引数を1つずつ渡したいときもあるでしょう。
そんなときは、「-L」オプションを使います。 一度に渡したい引数の数とともに指定すると、 最大でその数しか引数に指定されなくなります。

たとえば、全ユーザに対してidコマンドを実行したいときは、 以下のようにすればよいと思います。

  $ cut -d : -f 1 /etc/passwd | xargs -L 1 id
  uid=0(root) gid=0(root) groups=0(root)
  uid=1(daemon) gid=1(daemon) groups=1(daemon)
  uid=2(bin) gid=2(bin) groups=2(bin)
  ...

 

コマンドのこの位置に引数を指定したいという場合は、「-I」オプションを使います。 -Iオプションとともにパターンの文字列を指定し、 xargs のコマンドの引数にそのパターンを指定すると、実際の引数に置き換わります。

たとえば、/foo/bar にある、拡張子がmp3のファイルをもとに、 ある形式の出力を得るには、以下のように実行します。
(この形式は、ffmpeg の入力ファイルを指定する際に使います。)

  $ ls -1 /foo/bar/*.mp3 | xargs -I {} echo "file '{}'"
  file '/foo/bar/01.mp3'
  file '/foo/bar/02.mp3'
  file '/foo/bar/03.mp3'
  ...

なお、findを使って、同様の結果を得ることも可能です。
ただ、/foo/bar の直下以外のmp3なファイルも含まれてしまいますが。

  $ find /foo/bar/ -name \*.mp3 -exec echo "file '{}'" \;

あるいは、ちょっと長いですが、以下でも同様の結果を得られます。

  ls -1 /foo/bar/*.mp3 | while read file; do
  > echo "file '$file'"
  > done

 

「-a」オプションを使うと、標準入力ではなくファイルで引数を渡すことができます。 先程の例を置き換えると、以下のようになります。

  $ ls -1 /foo/bar/*.mp3 > filelist
  $ xargs -a filelist -I {} echo "file '{}'"

 

「-P」オプションと数を指定すると、 指定した数のコマンドを同時に実行してくれます。
たとえば、以下を実行すると、「sleep 1」〜「sleep 4」を順に実行するため、 合計10秒待たされます。

  $ seq 4 | xargs -L 1 sleep

ですが、以下のように-Pオプションを指定して実行すると、 4つのsleepを同時に実行するため、4秒待たされるだけになります。
(やっていることに意味はありませんが、 -Pオプションの動作を確認するための例ということで、ご了承くださいませ。)

  $ seq 4 | xargs -L 1 -P 4 sleep

並列に実行することで効率を上げられるときに指定するとよいのではないかと思います。

確認しながら実行する

「-p」オプションをつけると、実行する前に確認してくれます。

  $ seq 4 | xargs -L 1 -p sleep
  sleep 1 ? ...

「y」もしくは「Y」と答えると実行し、それ以外の場合は実行しません。

 

「-t」オプションをつけると、 実行するコマンドを標準エラー出力に出力してくれます。
前述のsleepの例ですが、 $ seq 4 | xargs -L 1 -t sleep sleep 1 sleep 2 ...

と実行すると、sleep が1つずつ実行されることが分かります。

  $ seq 4 | xargs -L 1 -P 4 -t sleep
  sleep 1
  sleep 2
  ...

と実行すると、sleep が一度に実行されることを確認できます。

…最終の出力結果を記しただけだと、違いがわからないですね…。
ですので、ぜひ実際に実行してみてください。

おわりに

以上、xargs の使い方を、簡単にご紹介しました。

ご紹介した以外にも様々なオプションがあります。 オンラインマニュアル(man xargs)などで確認しながらいろいろ試してみてください。

なお、以前にも、まとめて処理する的ネタをご紹介したことがありましたが、 xargs には触れておりませんでした。

触れてはいませんが、なにかの参考になるかもしれませんので、 念のため下記に列挙しておきます。よろしければさらっとご覧ください。

Vol.212 - 繰り返し的な処理を自動化する
http://www.usupi.org/sysad/212.html
Vol.218 - find を使いこなす
http://www.usupi.org/sysad/218.html

宿題の答え

前回の宿題は、

  コンテナ間を行き来するパケットを眺めてみましょう。

でした。

上記には何も書いていませんが、flanneldが使用するvxlanの話です。
ご存じない方は、下記をさらっとご覧いただければと思います。

Vol.278 - flannelを動かしてみる
http://www.usupi.org/sysad/278.html

さて、前回に書きました通り、vxlanが使用するUDPポートは、以下に記載されています。 8472番だそうです。

flannel/backends.md at master・coreos/flannel・github
https://github.com/coreos/flannel/blob/master/Documentation/backends.md

今回はちゃんと、双方でDockerのコンテナを起動し、 コンテナ間でpingを実行してみました。

設定方法は前回示した通りです。
コンテナのIPアドレスはそれぞれ「10.0.80.2」「10.0.47.2」です。
以下のように、10.0.80.2から10.0.47.2に対してpingを実行すると、応答が返ってきます。

  container1$ ping -c 2 10.0.47.2
  PING 10.0.47.2 (10.0.47.2) 56(84) bytes of data.
  64 bytes from 10.0.47.2: icmp_seq=1 ttl=62 time=5.42 ms
  64 bytes from 10.0.47.2: icmp_seq=2 ttl=62 time=4.86 ms

  --- 10.0.47.2 ping statistics ---
  2 packets transmitted, 2 received, 0% packet loss, time 1001ms
  rtt min/avg/max/mdev = 4.869/5.148/5.427/0.279 ms

その間、etcdやflanneldを動かしているマシンで、tcpdump を実行して、 UDPの8472ポートを使用するパケットをキャプチャしてみました。

  host1$ sudo tcpdump -i eth0 -s 1500 -w 8472.pcap udp port 8472
  (pingコマンドの終了後、Ctrl+C で止めます)
  4 packets captured
  4 packets received by filter
  0 packets dropped by kernel
  host1$ 

キャプチャしたパケットの情報は、 カレントディレクトリの8472.pcapというファイル名で保存しています。

2往復4パケットが、もれなくキャプチャできています。
内容を確認するには、tcpdump を起動してテキストで見るか、

  host1$ sudo tcpdump -r 8472.pcap -X

wireshark を起動して、GUI でわかりやすく見るか、してください。

  host1$ wireshark 8472.pcap

tcpdumpで見ると、まず1つ目のパケットが以下のようになっています。
(実際のパケットを一部変更しております。)

  IP 10.0.80.0 > 10.0.47.2: ICMP echo request, id 318, seq 1, length 64
	0x0000:  4500 0086 7340 0000 4011 82bd c0a8 0101  E...s@..@.......
	0x0010:  c0a8 0102 9db1 2118 0072 4607 0800 0000  ......!..rF.....
	0x0020:  0000 0100 dea3 3075 2f39 ce27 1b68 3ced  ......0u/9.'.h<.
	0x0030:  0800 4500 0054 28d8 4000 3f01 7fcf 0a00  ..E..T(.@.?.....
	0x0040:  5000 0a00 2f02 0800 ac37 013e 0001 b987  P.../....7.>....
	0x0050:  735b 0000 0000 56d3 0800 0000 0000 1011  s[....V.........
	0x0060:  1213 1415 1617 1819 1a1b 1c1d 1e1f 2021  ...............!
	0x0070:  2223 2425 2627 2829 2a2b 2c2d 2e2f 3031  "#$%&'()*+,-./01
	0x0080:  3233 3435 3637                           234567

最初の24バイト(オクテット)は、IPおよびUDPのヘッダです。
特に変わりはありませんが、以下に示します。

  [IPヘッダ]
  4500 0086 : IPのバージョン(4)、ヘッダ長(5x4)、全長(86h→134)
  7340 0000 : ID(7340h)、フラグとフラグメントオフセット
  4011 82bd : TTL(40h→64)、プロトコル(11h→17(UDP))、チェックサム
  c0a8 0101 : 送信元アドレス(192.168.1.1)
  c018 0102 : 宛先アドレス(192.168.1.2)
  [UDPヘッダ]
  9db1 2118 : 送信元ポート番号(9db1h→40369)、宛先ポート番号(8472)
  0072 4607 : UDPヘッダを含むUDPパケットの長さ(72h→114)、チェックサム

その後、UDPのデータ部に、vxlanのヘッダと、 もとのEthernetフレームが格納されています。

  [vxlanヘッダ]
  0800 0000 : フラグ(8)、予約(0)
  0000 0100 : ID(1)、予約(0)
  [(中の)Ethernetフレーム]
  dea3 3075 2f39 : 宛先MACアドレス(flannel.1のMACアドレス)
  ce27 1b68 3ced : 送信元MACアドレス(flannel.1のMACアドレス)
  0800 : Ethernet
  [(中の)IPヘッダ]
  4500 0054 : IPのバージョン(4)、ヘッダ長(5x4)、全長(54h→84)
  28d8 4000 : ID(28d8h)、フラグ(DF)とフラグメントオフセット
  3f01 7fcf : TTL(3fh→63)、プロトコル(1(ICMP))、チェックサム
  0a00 5000 : 送信元アドレス(10.0.80.0)
  0a00 2f02 : 宛先アドレス(10.0.47.2)
  [(中の)ICMPヘッダ]
  0800 ac37 : Echo Message(8)、コード(0)、チェックサム
  013e 0001 : ID(013eh)、シーケンス番号(1)
  ...

という感じで、確認ができました。
残りのパケットについては、各自ご確認ください。

なお、IPヘッダのフォーマットについては、下記をご覧ください。

RFC791 - Internet Protocol
https://tools.ietf.org/html/rfc791

また、UDPヘッダのフォーマットについては、下記をご覧ください。

RFC768 - User Datagram Protocol
https://tools.ietf.org/html/rfc768

そして、vxlanヘッダのフォーマットについては、下記をご覧ください。

RFC7348 - Virtual eXtensible Local Area Network(VXLAN)
https://tools.ietf.org/html/rfc7348

最後に、ICMPヘッダのフォーマットについては、下記をご覧ください。

RFC792 - Internet Control Message Protocol
https://tools.ietf.org/html/rfc792

今回の宿題

今回の宿題は、

  上限を超えた数の引数を指定してxargsが動くことを確認しましょう。

です。

上限を超えた数の引数をコマンドに指定して実行できないこと、 xargsを使うと実行できることを、確認してみてください。

なお、上限は、前述しましたが、getconf ARG_MAX の出力の通りです。

  $ getconf ARG_MAX
  2097152

あとがき

前回、変なスパムメールが届いたという話をしましたが、やはり、 わたしだけではなかったようです。下記に、 ほぼ同じ文面のスパムメールが紹介されております。

「ポルノを見ているお前を盗撮した」と脅迫し、動画を人質に身代金を
要求するサイバー攻撃が急増中-GIGAZINE
https://gigazine.net/news/20180822-hackers-watch-porn/

…ということですので、もし届いても、無視してしまいましょう。

ちなみに、こちらでは、8月17日を最後に、一旦メールが途切れました。
届いたのは、約30通でした。
これで終わったかな〜と思っていたのですが、8月29日と30日にも届いていました。 まだうっかり支払ってしまう人がいるのでしょうか。

で、面白いのは、メールの題名や本文に書かれていたパスワードが、 途中から空欄になったこと、身代金が上がったり下がったりしたこと、です。
(最初は1000ドルでしたが、最高で1400ドルまであがりました。)

なお、自分のメールアドレスが漏洩しているかどうかを確認できるサイトが、 以下にあります。

have i been pwned?
https://haveibeenpwned.com/

過去に流出したサイトの漏洩情報をもとに判定してくれるようです。
MSの著名な方が管理されているようですので、信じてよいと思います。

メールアドレスを入力してボタンを押すと、もし過去に漏洩していたら、 漏洩元と漏洩している情報の項目(メールアドレスや氏名、パスワードなど) をずらっと表示してくれます。(もちろん、情報の中身は表示されません。)

気になる方は、自身のメールアドレスを入力して確認してみてください。
そして、もし漏洩していると言われてしまったら、強固なパスワードへの変更、 2ファクタ認証の利用、通知の有効化、などを行ってください。
(…のようなことを言われます。)

で、実際のところどうなのか、試しに、 自分のメールアドレスをいくつか入力してみたのですが、 思った以上にいっぱい出てきてしまいました。
そんなわけで、いま途方に暮れているところです…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、10月7日に発行します。…きっと。

 

「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

その他、作者に関するページは、概ね以下にございます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://twitter.com/kuriking/ (twitter)
http://facebook.com/kuriking3 (facebook)
https://jp.pinterest.com/kuriking/ (pinterest) https://www.instagram.com/kuri_king_/ (instagram)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本