harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

infra 運用

rsync実行時に”Argument list too long.”で叱られた時のメモ、ついでにxargsで渡してみた

投稿日:2012年5月20日

Last Updated on 2016年4月12日 by かんりにん

アプリサーバーのログファイルが大量に増えたので、ログ退避用にバックアップ用ホストを用意して転送をしようとしたら
rsyncさんから”Argument list too long.”のお叱りを久々に食らったので、対処法をささっとメモ。
エラー”Argument list too long.”自体はrsyncに限ったものでは全くないです。
用意したサーバーはCentOS5.*、実行シェルはbashです。

※ディレクトリとかは使用例として書き換えてあり、実環境とは異なります。

叱られた時の実行ログ

/home/appuser/logs/以下にある数階層、数千個のディレクトリ、数万のログファイルにrsyncを実行したら…

 # rsync -avz -e ssh /home/appuser/logs/* appuser@192.168.0.21:/home/user/backup/logs/
 appuser@192.168.0.21's password:
 /usr/bin/rsync: Argument list too long.

こんな感じで叱られたorz
ちなみに、以下でもダメ。やはり叱られる。

 # rsync -avz -e ssh /home/appuser/logs/*.gz appuser@192.168.0.21:/home/user/backup/logs/
 appuser@192.168.0.1's password:
 /usr/bin/rsync: Argument list too long.

原因はバックアップ対象ファイルを”*”をつけてパターンマッチングにて指定する際
全てのリストを作成するが、引き数と環境変数の合計サイズの上限を超えてしまったためのこと。

今回は

  • 対象ファイルが多い
  • フルパスだとディレクトリ名が長い
    (今回は”/ab/cd/ef/gh/ij/kl/mn/op/….”とログファイルにたどり着くまで10階層ほどあった)

という状態で、必然と文字列が長くなり、execve(2) の制限を超えてしまったための様子。
パターンマッチングを使わずに、ディレクトリ指定でrsyncを実行してしまえば今回の作業は終わりなのだが
(これが解→
rsync -avz -e ssh /home/appuser/logs/. appuser@192.168.0.21:/home/user/backup/logs )、
せっかくなのでいろいろと調べてみることに。

参考:お世話になっております!
UNIXの部屋 コマンド検索: xargs
LinuxJM:EXECVE

ドキュメントを見ると、2.6.23以前のLinuxディストリビューションでは、長さの上限が128KBとのこと。
今回のサーバーはCentOS5.*、カーネル2.6.18なので

 # getconf ARG_MAX
 131072

131072byte = 128KB ということを確認。

ということで、簡単な対処法としては、こんな感じ。

  • execve() の上限を超えないように、xargを用いて実行
  • わざわざパターンマッチングを使う必要がなければ使わない(汗)

これについては、上に答えが出ているので、あえて検証はしない。
ということで、対処法(?)1のxargさんのお世話になってみる。

試してみた書式

 # ls | xargs -n1 -P4 -I$ rsync -avz -e ssh $ remoteuser@***.***.***.***:/path/to/targetdir/

とりあえず”Argument list too long.”を回避。
オプション”-P”は同時実行プロセスの最大数を指定するものなので、なくても可。デフォルト値は1。

※あくまでxargsを慣熟する目的も含めて、こんなことやってます。

ただ上記の書式だと、カレントディレクトリとは別のディレクトリを指定して実行しても、うまくいかなかったので時間があるときに引き続き調べてみる。
xargsのオプションもほとんど知らないので、いろいろ勉強します。
(きっと最適な書式があると思う…)

おまけ

カーネル2.6.23のCentOSではARG_MAXは2560KB/2.5MBになっていたので追記。

 $ getconf ARG_MAX
 2621440

上限値が大分増えていたので、ページサイズも確認してみたところ

 $ getconf PAGESIZE
 4096

ページサイズは2.6.18と変わらず4KB。しかし最大サイズは2560KB/2.5MBになっているので、メモリサイズが32ページから640ページと20倍になった計算。
この定義はどこにあるのかな…この疑問も暇なときに調べてみることにします。

プロのための Linuxシステム構築・運用技術 (Software Design plus)
中井 悦司
技術評論社
売り上げランキング: 46,053
Linuxシステム[実践]入門 (Software Design plus)
沓名 亮典
技術評論社
売り上げランキング: 123,634

-infra, 運用

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

no image

[運用] システム監視ツール”monit”を入れてみた(10年ぶりに!)

10年ぶりにmonitを入れてみますた。 常駐型の監視/オペレーションツールで、『プロセスの起動、停止、再起動ができるnagios』のようなもの(?) daemontoolと同様に、指定した条件でプロ …

no image

[メモ]DNS SPFレコードタイプトTXTレコードタイプについて(RFC7208)

  Route53で新サービス用のドメインのDNS環境整備ため、SPFレコードを登録しようとしたところ、レコードタイプに”SPF”なるタイプがあった! 自分は今までずっとTXT …

no image

[NTP]StepモードとSlewモード

DBサーバの時間同期の修正にあたって、どのくらいゆっくり修正できるのか調べたら、もともと”Slewモード”という”ゆっくり修正オプション(?)”があった …

no image

インフラ運用の心得:最低限やっておくこと

[pukiwiki] #contents *インフラ運用に最低限やっておくこと [#m5d8ab99] 以下の整備については、”呼吸するのと同じくらい当たり前のこと”としてやっ …

no image

[MySQL] ZRM(Zmanda Recovery Manager) を試してみる

お客さんのWebサイトで運用しているMySQLにて、ここんとこmysqldump実行時にエラーが出るように。 レプリケーションにてスレーブ2ホストで同期しているので、ダンプのエラー自体は緊急性は高くな …

宅麺