宣伝(おまけ問題つき): SoftwareDesign 11月号

Tue Oct 22 23:37:23 JST 2019 (modified: Tue Oct 22 23:41:05 JST 2019)
views: 1954, keywords:SoftwareDesign, シェル芸, シェル芸人からの挑戦状 この記事は最終更新日が5年以上前のものです。

 発売中です。今回のシェル芸人からの挑戦状は実用本位です。

幻の第4問

 実は今回は3問しか出題してません。前の3問の分量が多すぎて私の書いた4問目がボツになりました(涙)。せっかくなので、ここに掲載しておきます。

問題4: USBデバイスの監視

  • 出題、解答、解説: 上田
  • 難易度: 初級

 先月号で、USBの抜き差しを監視する次のような問題を出題しました。

/sys/を使い、USB機器の抜き差しを監視するワンライナーを書いてください。
   周期は1秒おきで、1秒以内に2つ以上の機器は抜き差しがあることは
   考慮しなくてもよいこととします。抜かれたら「抜かれました」、
   挿されたら「挿されました」と表示してください。

今度は、これを/var/log下のファイルを使って実装してみてください。今度は1秒以内ではなく即時に出力し、複数の抜き差しがあっても対応してください。表示する文言は自由です。なお、何らかのシステムに組み込むようなものではなく、ちょっとした機会に小手先で使うことを想定しています。

解答

 とりあえずどのログファイルを見れば分からない場合は、USB機器を抜き差しした後、関連しそうなログが追加されたファイルがないか調べてみましょう。grepを使って探していきます。これは、筆者の環境の例です。

$ cd /var/log
   ### 今日のログを探す(9月8日の例) ###
   $ sudo grep "Sep *8" ./ -R | head
   ./syslog:Sep  8 08:47:06 myserver ...
   (他、9件)

この例では正規表現を使い、今日の日付を探して最初の10件を表示しています。grep-Rはディレクトリ下のファイルを全て再帰的に検索するためのオプションです。

 さらに件数を絞り込みましょう。usbで調べます。

### usbという文字列を探す ###
   $ sudo grep "Sep *8" ./ -R | grep usb | head
   ./syslog:Sep  8 08:47:06 myserver ...
   (まだ10件出る)
   $ sudo grep "Sep *8" ./ -R | grep usb | uniq -w 20
   ./syslog:Sep  8 08:47:06 myserver kernel: [    0.034612] usbcore: ...
   ./syslog:Sep  8 08:50:17 myserver kernel: [  197.851221] usb 4-3: New USB device found, ...
   ./kern.log:Sep  8 08:47:06 myserver kernel: [    0.034612] usbcore: ...
   ./auth.log:Sep  8 09:01:58 myserver sudo:     ueda : ... COMMAND=/bin/grep -m 1 -i usb ./ -R

 最後のuniq -w 20は、「最初の20文字だけ比較して重複していないものを出力する」という意味になります。これで、筆者の環境では4件に絞り込めました。この4件の出力をよく見ると、syslogNew USB device found ...という文言が書かれています。syslogを監視すればよさそうです。

 もちろん、この例では検索漏れ(例えば大文字のUSBなど)があるかもしれませんが、とりあえずひとつ適切そうなログファイルsyslogが見つかりました。Ubuntuの場合、syslogには、他の様々な機器の情報や起動、シャットダウンの際の情報が記録されます。

 次に、syslogの中身を調べましょう。less syslogでログを開いて、すぐにG(Shift+G)を押して下の方からさきほどのUSBの抜き差しの記録をみます。他のログに埋もれている場合はもう一度機器を抜き差ししてみましょう。

$ less syslog
   (Shift+G) 
   Sep  8 10:01:32 myserver kernel: [ 4473.226091] usb 4-3: new SuperSpeed USB device number 7 using xhci_hcd
   Sep  8 10:01:32 myserver kernel: [ 4473.248351] usb 4-3: New USB device found, idVendor=0bda, idProduct=8153
   (中略)
   Sep  8 10:02:32 myserver kernel: [ 4533.157138] usb 4-3: USB disconnect, device number 7

ログを見ると、機器が挿されたときはいくつかログが記録されています。また、抜かれたは一行、その旨が記録されています。問題に対する解答としては、挿されたときの「New USB device found」と抜かれたときの「USB disconnect」を表示すればよさそうです。

 ということで、解答例を示します。これで十分でしょう。

$ tail -f syslog | grep -e 'New USB device found' -e 'USB disconnect'
   Sep  8 10:28:52 Ubuntu18server kernel: [  188.863597] usb 4-5: New USB device found, idVendor=0bda, idProduct=8153
   Sep  8 10:29:06 Ubuntu18server kernel: [  202.450685] usb 4-5: USB disconnect, device number 3
   Sep  8 10:29:14 Ubuntu18server kernel: [  211.187090] usb 4-6: New USB device found, idVendor=0bda, idProduct=8153
   Sep  8 10:29:16 Ubuntu18server kernel: [  213.072891] usb 4-6: USB disconnect, device number 4

tail -fで、追記されたログを逐次出力し、抜き差しを表すログをgrepで選別します。検索語が二つあると正規表現を凝りたいと思うかもしれませんが、grep-eをつけることで複数の正規表現を並べて書くことができます。

 以上、幻の第4問でした。

その他

 それから、これは必読ですねー(棒)

 ということで、よろしくお願いいたします。

photo
ソフトウェアデザイン 2019年11月号
[本間 咲来 山本 達也 武井 宜行 吉川 英一 山田 祥寛 神戸 康多 福田 鉄平 天地 知也 星 直史 安藤 幸央 結城 浩 武内 覚 宮原 徹 平林 純 くつなりょうすけ 坂井 恵 杉村 貴士 高橋 憲一 中島 明日香 伊藤 雄貴 職業「戸倉彩」 中村 壮一 山田 泰宏 田代 勝也 上田 隆一 mattn 青田 直大 中島 雅弘 あわしろいくや 法林 浩之 清水 俊之介 樽石 将人 やまねひでき 古守 花織 杉山 貴章]
技術評論社 2019-10-18 (Release 2019-10-18)

(powered by amazon-item v0.2.1)

ノート   このエントリーをはてなブックマークに追加 
 

prev:10/26にシェル芸勉強会やりますよー next:【問題のみ】jus共催 第44回シェル芸7周年で変態化が進みすぎなので実用的な問題しか出さないぞと宣言しておく勉強会(無保証)

やり散らかし一覧

記事いろいろ