Memo/Linux/curl

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/curl
 

curl(libcurl)


exit codeとhttp_code

「-w "%{http_code}"」が「000」を返す場合、http codeに未定義のエラーが発生している。
「curl ...;echo $?」で原因が分かる場合がある。


slabメモリ使用量が肥大しメモリ不足になる

curl(libcurl)で定期的にhttps://リクエストを発行するようなサーバでメモリ不足になる。 topでみても怪しげなプロセスは無い。 「slabtop」で見るとdentryが異常にメモリを使っている。

  • 環境
  • CentOS 6.x 64bit
  • 記事
  • 原因
rpm -q nss-softokn
nss-softokn-3.14.3-23.el6_7.x86_64
  • 対策
  • slabキャッシュ解放
sync; echo 2 > /proc/sys/vm/drop_caches
  • curl, nssの更新
sudo yum update curl nss-softokn
  • curlを実行するスクリプトに追加。2択
export NSS_SDB_USE_CACHE=yes
# または
export TMPDIR=/dev/shm
  • 対策前:
# curl実行後 dentunusd が大きく増えている事を確認
sar -v 1
105021秒 dentunusd   file-nr  inode-nr    pty-nr
10502242860       768     27417        10
10502342860       768     27417        10
...
strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000056           0      4505      4503 access
------ ----------- ----------- --------- --------- ----------------
100.00    0.000056                  4505      4503 total
  • 対策後:
export NSS_SDB_USE_CACHE=yes
strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0        23        21 access
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    23        21 total

curlでSSLが失敗する場合

curlが参照している中間証明書(CA)が古い場合にも起きる。 php等でlibcurlを使っている場合も同様。 golangも同様に発生。

  • 記事
  • CentOS6.x
sudo yum update ca-certificates libcurl curl nss

# 解決しない場合
mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.$(date +%Y%m%d)
wget http://curl.haxx.se/ca/cacert.pem -O /etc/pki/tls/certs/ca-bundle.crt

curlオプション

  • プロキシ経由でアクセス
curl -x proxy.example.com:8080 -L https://www.google.com
  • -z/--time-cond <file> : リモートが新しい時のみダウンロード。ダウンロードパスを変更するには「-o <path/to/file> -z <path/to/file>」のように組み合わせる
  • --retry-max-time <seconds> : リトライを指定時間以内に終わらせる。
  • --retry <num> : 再試行回数。--max-timeには影響されず、--retry-max-timeを指定する必要がある
  • -m/--max-time <seconds> : コマンド実行を指定時間以内に終わらせる。ただし、--retryには影響しない
  • --connect-timeout <seconds> : 接続するまでのタイムアウト。接続した後に時間がかかる場合には向かない
  • -w/--write-out <format> : 出力を加工
# http status
curl -LI -s -w "%{http_code}" "http://www.google.co.jp" -o /dev/null 2>&1
200 #結果
# download spees (byte)
curl -s -w "%{speed_download}" "http://www.google.co.jp" -o /dev/null 2>&1
242079.000
  • -s/--silent プログレスメータやエラーメッセージを表示しない
  • -S -sと併用するとエラーメッセージだけ表示する
  • -H/--header <line> : httpヘッダ等を付与できる
  • -T/--upload-file <file> : PUTメソッドでファイルを送信
  • -X POST 等のメソッドを指定。デフォルトはGET
  • -d "key=value" でデータを送信できる。-X POST -d "key1=value1" -d "key2=value2"
  • -o filename 出力をファイルに保存
  • -O アクセスしたファイルがindex.htmlなら同じ名前で保存
  • -i http headerも出力
  • -I http headerのみ表示。HEAD メソッドと同じ
  • -A ユーザエージェントを指定
  • -L リダイレクトされていても取得
  • --insecure SSL証明書を無視

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-06-09 (火) 16:28:13 (133d)