カテゴリー: linux

  • 標準出力と、標準エラー出力をまとめてリダイレクトする

    標準出力と、標準エラー出力をまとめてリダイレクトする

    たまに使うんだけど、順番を毎回ググって確認していた 2>&1 というリダイレクト処理がある

    いままで

    command >> word 2>&1

    という書き方で、標準出力、標準エラー出力をリダイレクトしてきたが、

    実は bash 4.0 から以下のような記載ができるようになったようだ。

    command &>> word

    man コマンドで bash を見ると以下のような記載がある

    The format for appending standard output and standard error is:

    &>>word

    This is semantically equivalent to

    >> word 2> &1

    https://www.gnu.org/software/bash/manual/html_node/Redirections.html

    これは便利なので活用していきたい。

    参考情報

    https://qiita.com/r_plus/items/41fb31285fb64fb4be85
  • embulk に環境変数で接続情報を渡す

    embulk に環境変数で接続情報を渡す

    tl;dr;

    embulk で環境変数を処理することができる.liquid

    について紹介。これを使うことで、docker image を複数環境で起動することができるようになる。

    公式ドキュメント

    以下のような記載がある。

    https://www.embulk.org/docs/built-in.html

    試してみた

    準備

    以下のようなディレクトリ構成

    “`
    ├── Dockerfile
    └── config.yml.liquid

    “`

    それぞれ中身は以下の通り

    FROM java:8
    MAINTAINER sumito.tsukada "tsukada@sumito.jp"
     
    ENV EMBULK_VERSION 0.9.23
     
    RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
    RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
    RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
    
    COPY config.yml.liquid /work/
     
    WORKDIR /work
    ENTRYPOINT ["java", "-jar", "/opt/embulk.jar", "run", "/work/config.yml.liquid"]

    受け取る側には {{env.}} を接頭辞として付ける。

    in:
      type: mysql
      user: {{env.DB_USER}}
      password: {{env.DB_PASS}}
      database: {{env.DB_NAME}}
      host: {{env.DB_HOST}}
      query: {{env.DB_QUERY}}
    out: {type: stdout}

    build

    docker build コマンドでビルドする。

    $ docker build -t tsukada/embulk .
    Sending build context to Docker daemon  3.072kB
    Step 1/9 : FROM java:8
     ---> d23bdf5b1b1b
    Step 2/9 : MAINTAINER sumito.tsukada "tsukada@sumito.jp"
     ---> Using cache
     ---> 5fc85815e7bd
    Step 3/9 : ENV EMBULK_VERSION 0.9.23
     ---> Using cache
     ---> d449016ef749
    Step 4/9 : RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
     ---> Using cache
     ---> ea1d918c1c64
    Step 5/9 : RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
     ---> Using cache
     ---> e7057cd4cefe
    Step 6/9 : RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
     ---> Using cache
     ---> 01d70f5dc598
    Step 7/9 : COPY config.yml.liquid /work/
     ---> Using cache
     ---> 8f7529947df8
    Step 8/9 : WORKDIR /work
     ---> Using cache
     ---> 7d4b1d4ea599
    Step 9/9 : ENTRYPOINT ["java", "-jar", "/opt/embulk.jar", "run", "/work/config.yml.liquid"]
     ---> Using cache
     ---> 8161e0f70fde
    Successfully built 8161e0f70fde
    Successfully tagged tsukada/embulk:latest

    使い方

    環境変数に接続先情報や、クエリの情報を渡す。

    $ docker run -e DB_USER=tsukada -e DB_PASS=password -e DB_NAME=database -e DB_HOST=hogehoge.ap-northeast-1.rds.amazonaws.com  -e DB_QUERY="select * from sample" --rm -it tsukada/embulk
    2020-02-18 03:43:44.882 +0000: Embulk v0.9.23
    (中略)
    2020-02-18 03:43:52.822 +0000 [INFO] (0015:task-0000): > 0.00 seconds
    1,tsukada,hoge,,2020-02-14 09:14:31,2020-02-14 09:14:32,84,004,2020-02-14 09:14:31,2020-02-14 09:14:31
    2020-02-18 03:43:52.913 +0000 [INFO] (0001:transaction): {done:  1 / 1, running: 0}
    2020-02-18 03:43:52.917 +0000 [INFO] (main): Committed.
    2020-02-18 03:43:52.917 +0000 [INFO] (main): Next config diff: {"in":{},"out":{}}

    .liquid ファイル内では env. で受け取るが、docker 起動する際に渡す環境変数には、env を付けづに実行する。

    無事データを取得することができた。

    所感

    これを使えば、コンテナ内にcredential情報を保持しなくて済むようになるため、1つのcontainer imageで、複数環境で動かすことができそうだ。

  • org/embulk/cli/Main : Unsupported major.minor version 52.0

    org/embulk/cli/Main : Unsupported major.minor version 52.0

    tl;dr;

    embulk をbuild しようとすると ` Unsupported major.minor version 52.0` というエラーが出るようになった。原因と対処について紹介。

    元にした作業手順(2018年だから、もう2年も前だ。。)

    https://tsukada.sumito.jp/2018/09/18/mysql%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92embulk%e3%81%a7bigquery%e3%81%b8%e5%85%a5%e3%82%8credash%e3%81%a7%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b/

    エラー詳細

    Exception in thread "main" java.lang.UnsupportedClassVersionError: org/embulk/cli/Main : Unsupported major.minor version 52.0
    	at java.lang.ClassLoader.defineClass1(Native Method)
    	at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
    	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    	at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    	at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

    原因

    embulk でjava 7のサポートが切れた。build する際にプラグインの組み込み段階でエラーになる。

    対処

    embulk のベースの docker image を

    `FROM java:7` から

    `FROM java:8` に変更する。

    サンプル

    FROM java:8
    MAINTAINER sumito.tsukada "tsukada@hoge.jp"
     
    ENV EMBULK_VERSION 0.9.23
     
    RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
    RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
    RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
     
    WORKDIR /work
    ENTRYPOINT ["java", "-jar", "/opt/embulk.jar"]
    CMD ["--help"]
    

     

     

     

  • Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

    概要

    useradd コマンドで作成したユーザでログインできない。

    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).  というエラーが出た際の対処。

    はじめに

    以下の手順でアカウントを作成した。

    useradd sumito.tsukada

    鍵の作成

    ssh-keygen -t rsa

    作成された秘密鍵を、接続元サーバにコピー

    ~/.ssh/id_rsa

    接続元で権限は 400 とした。

    いざsshしてみようとしたら

    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

    が発生。

    原因

    接続先のサーバに `.ssh/authorized_keys` が存在していない。

    対処

    接続先のサーバで公開鍵をコピーし、権限を644に設定する。

    cp .ssh/id_rsa.pub .ssh/authorized_keys
    chmod 644 .ssh/authorized_keys

    参考情報

    http://dqn.sakusakutto.jp/2012/01/sshpermission_denied_publickey.html

  • mmap() failed: [12] Cannot allocate memory

    mmap() failed: [12] Cannot allocate memory

    はじめに

    laravelをinstall時、memoryが不十分だとinstallでエラーになる。

    twitterで投稿したところ、アドバイスもらった。確かにswapの設定してなかった。。

    クラウドであれば一時的にインスタンスタイプを変更することでインストールできるが、今回はインスタンスタイプを変更せず対応する。

    swapを設定する

    実は、GCPやAWSの場合、デフォルトでswapの設定がされていない。

    # free
                  total        used        free      shared  buff/cache   available
    Mem:         601172      383328       48068       14160      169776      107824

    手動でswapを設定する

    cat /proc/swaps
    dd if=/dev/zero of=/swapfile bs=1M count=2048
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    free -m

    再起動しても設定されるよう、fstabに設定を追加する

    /swapfile   swap        swap    defaults        0   0

    作業後

    無事swapが追加された

    free -m
                  total        used        free      shared  buff/cache   available
    Mem:            587         375          43          13         167         103
    Swap:          2047           0        2047

    @kondonator さん、ありがとうございます🙏

     

  • 作業ブランチを別リポジトリのブランチへ引っ越し

    作業ブランチを別リポジトリのブランチへ引っ越し

    はじめに

    アプリケーションを作っていると、当初作ろうとしていたものと、今作っているものが徐々にズレてくることがある。

    その時に考えることの一つが、「リポジトリどうしよう」ってやつだ。

    新しいリポジトリとはいえ、いきなりmasterにpushするのもなんだか忍びない。

    今回はリポジトリのブランチを別のリポジトリのブランチとしてコピーする方法を紹介。

    やりたいこと

    いたって簡単。

    これだ。これをやりたいのだ。

    コマンド

    # 新しいリポジトリをclone
    git clone git@git.sumito.com:hoge/AFTER-REPO.git
    cd AFTER-REPO
    git checkout -b AFTER-BRANCH
    
    # remote登録
    git remote add tmpbranch git@git.sumito.com:hoge/BEFORE-REPO.git
    git pull tmpbranch AFTER-BRANCH --allow-unrelated-histories
    
    # 新BRANCHへpush
    git add .
    git commit -m 'copy'
    git remote rm tmpbranch
    git push origin AFTER-BRANCH

    あとはpushした先で期待通りになっているか確認するだけでよい。

     

  • ワンライナーでサイトのレスポンス速度を計測する

    ワンライナーでサイトのレスポンス速度を計測する

    はじめに

    しっかりした監視ツールを導入せずに、さくっとレスポンス速度を可視化したいときがある。

    手軽に描写できるワンライナーを紹介。

    どんなことができるか

    ワンライナー

    while true; do sleep 1; curl -kL 'http://接続先URL' -o /dev/null -w "%{time_total}" 2> /dev/null | perl -anle 'print "▇"x($F[0]*100)." $F[0]"' ;done
    

    [ec2-user@ip-10-1-8-134 ~]$ while true; do sleep 1; curl -kL 'https://tsukada.sumito.jp' -o /dev/null -w "%{time_total}" 2> /dev/null | perl -anle 'print "▇"x($F[0]*100)." $F[0]"' ;done
    ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 0.361941
    ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 0.370393
    ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 0.904969

    状況に応じて

    “` *100 “` の部分を適宜変更する。

     

  • let’s encrypt に登録したメールアドレスを変更する

    let’s encrypt に登録したメールアドレスを変更する

    はじめに

    let’s encrypt にメールアドレスを登録すると、証明書の有効期限が近くなると通知してくれる機能がある。その通知先を変更する方法を紹介。

    手順

    “` certbot-auto “` を利用することで簡単に変更が可能だ。

    詳細は以下の通り

    /usr/local/src/certbot/certbot-auto register --update-registration --email [new Mailaddress]

    結果

    # /usr/local/src/certbot/certbot-auto register --update-registration --email letsencrypt@sumito.jp
    Upgrading certbot-auto 0.34.2 to 0.35.1...
    Replacing certbot-auto...
    Creating virtual environment...
    Installing Python packages...
    Installation succeeded.
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Usage 'certbot register --update-registration' is deprecated.
    Please use 'certbot update_account [options]' instead.
    
    
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Would you be willing to share your email address with the Electronic Frontier
    Foundation, a founding partner of the Let's Encrypt project and the non-profit
    organization that develops Certbot? We'd like to send you email about our work
    encrypting the web, EFF news, campaigns, and ways to support digital freedom.
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    (Y)es/(N)o: y
    
    IMPORTANT NOTES:
     - Your e-mail address was updated to letsencrypt@sumito.jp

     

  • watch curl時にダウンロード状況を出さない

    watch curl時にダウンロード状況を出さない

    はじめに

    curlをwatchコマンドでポーリングしたい場合がある。しかし、
    普通に実施すると、ダウンロード進捗状況が表示されてしまう。

    watch curl http://hogehoge.com/version

    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 199 100 199 0 0 199 0 0:00:01 --:--:-- 0:00:01 33166

    対処

    curlには “` -s “` という進捗を表示しないモードがある。

    watch curl -s http://hogehoge.com/version
    

     

     

  • ディレクトリの中のファイルの文字を一括置換するワンライナー

    ディレクトリの中のファイルの文字を一括置換するワンライナー

    はじめに

    ディレクトリの中のファイルの文字を一括置換したい時がある。一括置換するワンライナーを紹介。

    前提

    変換元: github.com/hogehoge/src
    変換先: git.sumito.com/hogehoge/src

    ワンライナー

    grep -rl github.com/hogehoge/src ./* | xargs perl -i -pe 's#github.com/hogehoge/src#git.sumito.com/hogehoge/src#g'

    注意

    grep の検索文字はエスケープしない。
    sedの区切り文字は / (スラッシュ) で区切ることが一般的だが、他の文字で代用も可能。
    特にディレクトリのような / (スラッシュ) が入る際は、他のものを今回は # (シャープ)を区切り文字とする。