投稿者: sumito.tsukada

  • dockerを長期的に使いDISKを圧迫した時の対処

    dockerを長期的に使いDISKを圧迫した時の対処

    はじめに

    dockerを長期的に運用していると、気がついたらdiskがなくなってることがある。

    # df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda3        16G   14G  1.2G  93% /

    気がつけば93%もう後がない状態。

    対処

    dockerの不要なボリュームを削除することで対処可能

    まずは使われていないdiskを確認する。

    # docker volume ls -f dangling=true
    DRIVER              VOLUME NAME
    local               0d0c5c35a033c3fbf35bc8eb3b1f9a9612ece1c622cf0ad357b6e20084350760
    local               9aea772f64985c7a271f5d20c519b4a59ccd2219030f961c37a1cfb0130f2d35
    local               55ccc89f56ebe15c4091cb4b196877ea08e9dd93ecb26fd17b941baf03458b58
    local               93ef3cb97887f0d357332afbcebb5c096f7e8eaae4bcfd2285042e51d53771c7
    local               529d774ed12a837ceb118b56ef16bd2ad9420973cd76f1a76575c21e9b0719ff
    local               543b74740c96e9925d66546fd56b2e8eb3e2254706c0ae10e37dfd54c3719033
    local               635117bef58efbcaff9d0b8aab47702d2ad271bb5fffd4e0ab8f700e3d5aa2f5
    local               069661160a320af109bccf5099d1f4b7f5a2003911ba8d029075c45b145873d1
    local               af62d09de828c78ed362278a8bda4120649dadb5e3d824e65c6309c0293d7d37
    local               c8e396a769f4c4e8a0829f9b230fec92b282b9b36575218d25b89bf9891349d5
    local               d190aecd81bc16520210af668c3ea0fec32a1b1a3d8554a058c5cef65f87de09
    local               dcd49f633c6c0fbb7307788cc1521b6cc9c851fdd52aab9f0af7687ed3a1ab3e
    local               e0b22e274022a38e0aedbd6db1b950c3084d1f463e5f1a47b79d5e38d61e5bcb
    local               e051a42bc994b73f704863559f818289a4c38ec6f314b99be365e9a6484ac604
    local               ebad853173f65bd381eb52f43493825a8e3e9c19bbaaa7dcfd6b03f39611cf4f
    #

    不要なdiskがぞろぞろ出てくる。

    パイプで繋いでxargsで削除。

    # docker volume ls -qf dangling=true | xargs docker volume rm
    0d0c5c35a033c3fbf35bc8eb3b1f9a9612ece1c622cf0ad357b6e20084350760
    9aea772f64985c7a271f5d20c519b4a59ccd2219030f961c37a1cfb0130f2d35
    55ccc89f56ebe15c4091cb4b196877ea08e9dd93ecb26fd17b941baf03458b58
    93ef3cb97887f0d357332afbcebb5c096f7e8eaae4bcfd2285042e51d53771c7
    529d774ed12a837ceb118b56ef16bd2ad9420973cd76f1a76575c21e9b0719ff
    543b74740c96e9925d66546fd56b2e8eb3e2254706c0ae10e37dfd54c3719033
    635117bef58efbcaff9d0b8aab47702d2ad271bb5fffd4e0ab8f700e3d5aa2f5
    069661160a320af109bccf5099d1f4b7f5a2003911ba8d029075c45b145873d1
    af62d09de828c78ed362278a8bda4120649dadb5e3d824e65c6309c0293d7d37
    c8e396a769f4c4e8a0829f9b230fec92b282b9b36575218d25b89bf9891349d5
    d190aecd81bc16520210af668c3ea0fec32a1b1a3d8554a058c5cef65f87de09
    dcd49f633c6c0fbb7307788cc1521b6cc9c851fdd52aab9f0af7687ed3a1ab3e
    e0b22e274022a38e0aedbd6db1b950c3084d1f463e5f1a47b79d5e38d61e5bcb
    e051a42bc994b73f704863559f818289a4c38ec6f314b99be365e9a6484ac604
    ebad853173f65bd381eb52f43493825a8e3e9c19bbaaa7dcfd6b03f39611cf4f
    #

    93% -> 72%に削減できた

    # df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vda3        16G   11G  4.3G  72% /

    コマンドの詳細

    dockerの -f “dangling=true” はフィルタオプション。

    “dangling=true” はどのコンテナにも紐付いていないボリュームを抽出する事が可能。

     

  • Cloud Storageをコマンドで操作する

    Cloud Storageをコマンドで操作する

    はじめに

    awsであればファイル置き場にS3を使うことも多いだろう。
    s3への転送したい場合はaws s3 cpコマンドを使うことが多い。 似たようなことをGCPでCloud Storageに対して行いたいことがある。

    コマンド

    ローカルからファイルをコピーする場合 gsutilコマンドを利用する

    gsutil cp /tmp/hogehoge gs://bucket/dir/

    削除する場合は

    gsutil rm gs://bucket/dir/hogehoge

    オフィシャル情報はこちら https://cloud.google.com/storage/docs/gsutil?hl=ja

    おまけ

    ちなみにプログラム(Python)に組み込む際はこちら https://tsukada.sumito.jp/2018/11/20/gcp-python-cloud-strage-upload/

  • macでcronがうまく動かない

    macでcronがうまく動かない

    はじめに

    決まった時間に処理を行いたい時、cronを設定することが多い。しかし、時間を設定するとなぜかうまく動かない。ということが発生した。

    ダメだった例

    0 0 * * * mkdir -p ~/Documents/Downloads/`/bin/date +%Y%m%d`

    毎日0時0分にディレクトリを作りたい。
    ~/Documents/Downloads/配下に日付ディレクトリを作りたかったが、うまく動かなかった。

    対処

    macでは%は区切り文字として認識されてしまう。 そのため、%の前では¥でエスケープしてあげる必要があることがわかった。

    0 0 * * * mkdir -p ~/Documents/Downloads/`/bin/date +\%Y\%m\%d`

    Linuxでは必要ないが、macでは必要らしい。 これで期待通りディレクトリが作成されるようになった。          

  • redashが正常に動いているか、どう監視するか。

    redashが正常に動いているか、どう監視するか。

    メリークリスマス⛄️
    本記事はredash advent calendarの12/24の記事です。

    はじめに

    redashはさまざまな人が使うツールへと発展してきました。

    それに応じてredashは常に安定稼働していなければならない必要性も高まってきています。

    redashの状態監視がますます必要な状態になりました。

    redashの監視といえば、status.jsonというものがあります。
    https://kakakakakku.hatenablog.com/entry/2017/12/21/025718

    これを使えば、いまredashがどれだけのクエリが保存されていて、memoryを使っていて。。。ということがわかるのですが。。

    しかしある時、API経由で使っている人が「redashの返すクエリの結果が変わらないんだけど。。。」という問い合わせを受けました。

    redash自体ハングしていたら、この状態はstatus.jsonではわからないのです。

    redashが”機能的に正常に動いているのか、監視する必要がでてきました。

    どうやるか

    “機能的に”動いているかを確認したいのであれば、”機能的に”監視するのが一番。

    redashでは単純に現在時間を返すクエリを登録します

    SELECT to_char(now() + interval '9hour'  , 'YYYY/MM/DD HH24:MI:SS');

    データソースはredashの持つpostgresにしました。

     

    redashを監視サーバからAPIで叩きに行き、

    前回実行した時間を差分を取るという仕組みです。

    前回と違う結果だったら問題なし。同じ結果だったら”異常”とみなす。

     

    監視サーバには以下のシェルを置きました。

    # cat  ./redash_monitor.sh 
    #!/bin/bash
    
    # redashに問い合わせ(cache clear)
    $(curl -s https://redash-url.jp/api/queries/309/refresh?api_key=HoZrcikN0uhqNnaAPUtHKhogehogehogehoge -X POST > /dev/null )
    
    sleep 30;
    # 現在の値を取得
    curl -s https://redash-url.jp/api/queries/309/results.json?api_key=HoZrcikN0uhqNnaAPUtHKhogehogehogehoge  | jq -r '.query_result.data.rows[].to_char ' > /tmp/monitor.txt.tmp
    
    # 差分を比較する。差分があれば通知。
    diff /tmp/monitor.txt.tmp.previous /tmp/monitor.txt.tmp
    
    if [ $? -eq 0 ]; then
      # 文字を整形する
      # headder
      cat << _EOT_ > /tmp/msg.txt
      [info]
      [title] Redash might not work well
      [/title]
      Oh my Gush!! Your redash might not work well
      [/info]
      _EOT_
    
      _roomid=1234567890
      _body=`cat /tmp/msg.txt`
      curl -X POST -H "X-ChatWorkToken: 9aaefddccc40hogehogehogehoge" -d "body=${_body}" "https://api.chatwork.com/v2/rooms/${_roomid}/messages"
    fi
    
    mv /tmp/monitor.txt.tmp /tmp/monitor.txt.tmp.previous

     

    我々の環境はchatworkを使っているので、宛先はchatworkになっています

    これをcronに登録し定期的に実行するようにしています。

    最後に

    大活躍する機能。と思いたいけど実はredash自体が優秀なためそれほど日の目を見る事はないのです。。
    だけどこの監視を設定していると、いち早くredashの不具合に検知することができます。

    ちなみにredashがおかしくなったら、serverやworkerコンテナを消してもう一度作り直すのが多いです。

    明日は @ariarijp さんによる記事です!
    https://adventar.org/calendars/3299#list-2018-12-25

  • redashで誰が何のクエリを投げたのかMySQL側で確認する

    redashで誰が何のクエリを投げたのかMySQL側で確認する

    はじめに

    MySQLはredashで最も多く使われるデータソースの一つです。

    MySQLにつなぐ際、用途ごとにユーザーを作成するのが一般的な運用だと思います。

    我々はredashも例外ではなく、redash用に”redash”というアカウントをDBに登録しています。つまり、redashからMySQLに接続する際”redash”というユーザーが繋ぎに行くことになります。

    そのため、DB側でみると、すべてが”redash”ユーザーになってしまうと思い込んでいたので、MySQL側から「誰が何をやったのか」はわからないはず。と思ってました。

    ※ redashは version 6 bata版を使っています。

    実際はどうなのか

    実はredashからMySQLに送られるデータはコメント欄にredashのアカウントが記載されています。

    +-------+-------------+---------------------+-----------+-------------+---------+-----------------------------------------------------------------------------+------------------+|
    | Id | User | Host | db | Command | Time | State | Info |
    |+-------+-------------+---------------------+-----------+-------------+---------+-----------------------------------------------------------------------------+------------------+| 
    | 23745 | redash | 172.1.2.25:58582 | mysqldb | Query | 123 | preparing | /* Username: tsukada@sumito.jp, Task ID: 86611845-6b88-4b82-b1e3-6951236f8ad6, Query ID: adhoc, Queue: queries, Query Hash: f175924439bfb73a2df8c81234567890 */ SELECT s.id, s.date FROM sample s |https://tsukada.sumito.jp/wp-admin/post.php?post=691&action=edit# | 

    上記からわかる通り、実施するクエリの前に以下の部分がコメントとして追加されてます。

    /* Username: tsukada@sumito.jp, Task ID: 86611845-6b88-4b82-b1e3-6951236f8ad6, Query ID: adhoc, Queue: queries, Query Hash: f175924439bfb73a2df8c81234567890 */

    このUsernameはredashに登録されているユーザのメールアドレスになるのが注意です。

    show processlist;

    と組み合わせて、誰が重いクエリを投げているのか、DB側からも誰が何を実施したのかトレースが可能です。

    さいごに

    他のデータソースは試してないので、
    もしご存知の方いらっしゃったら

    Redash Advent Calendar ( https://adventar.org/calendars/3299 )

    に記載してぜひ教えてください。

  • ERROR: cannot create network conflicts with network  networks have overlapping IPv4

    ERROR: cannot create network conflicts with network networks have overlapping IPv4

    はじめに

    Docker composeなどを使い、コンテナを立ち上げるとネットワークコンフリクトが発生することがある。

    Creating network "xxx_net" with driver "bridge"
    ERROR: cannot create network 8f6775a9e84cef2a10d6bbbf (br-8f6775a94c): conflicts with network acdac1 (br-605313): networks have overlapping IPv4

    原因

    既にこのネットワークを使うdockerネットワークが存在する

    対処

    使っていないネットワークが多い場合、整理する

    # docker network prune
    WARNING! This will remove all networks not used by at least one container.
    Are you sure you want to continue? [y/N] y
    Deleted Networks:
    

     

  • redashの導入、運用で得た知見、改善まとめ

    redashの導入、運用で得た知見、改善まとめ

    はじめに

    redashは去年の年末頃Version 4が出て、夏にVersion 5、そしてVersion 6が近日リリースというスピードで、どんどんメジャーバージョンアップを繰り返し、機能が拡充されています。

    レアジョブではDocker版 redash Version 1.03で初めてredashを導入し、何度もVersion UPを繰り返し現在は最新版(5.02)を使っています。

    そこで得た知見についてはメモを書いていましたが、( https://tsukada.sumito.jp/category/tech/redash/ ) あくまでもメモベースなので、これを機にちゃんとブログとしてまとめたいとおもいます。

    弊社での利用者

    アルバイトから役員まで、様々なロールを持ってる人が使ってます。

    Botも動いており、一部APIを使い、Chatに通知する仕組みも取り入れています。

    SQLを書ける人を増やしたい

    最初は非エンジニアの方は書けない人が大半でした。

    社内勉強会を定期的に開き、誰でもSQLを書ける土台を作りました。

     

    社内勉強会の成功は「自分ゴト化」がキモ。非エンジニアにSQLを教えた話

    https://appeal.rarejob.co.jp/2016/11/11/2174/

    それでもすぐにSQLが書けるようにはならないので、足りない部分はchatで専用の窓口を開き、SQLやredashについて気軽に質問できる土台を作りました。

     

    redashの使い方についてはkakakakakkuさんのhandson資料を使わせてもらい、社内でredash使える人を増やしました。

    https://github.com/kakakakakku/redash-hands-on

    APIを使いたい

    残念ながらAPIについてのドキュメントはあまりありません。

    ソースを見るのが一番早かったりします。

    https://github.com/getredash/redash/blob/master/redash/handlers/api.py

    運用編

    redashのコンテナの役割を知りたい

    以前Qiitaにまとめた記事にredash_serverコンテナがどのような振る舞いをしているのかまとめた。

    https://qiita.com/S-T/items/bee0ae9c8c0acbd940cc

     

    redashのバックアップを取りたい

    基本的にredashのデータはredashのPostgresに入ります。redisはキャッシュ情報が入るのでこちらはバックアップの対象外で問題ありません。(自分はクエリが詰まったらredisの中身を全部空にしたりします)

    我々はDockerで動かしているので、host側から以下のcronを仕込んでます。

    0 6 * * * /bin/docker exec redash_postgres_1 pg_dump -U postgres postgres | /bin/gzip > /tmp/redash_backup.gz

    このバックアップで取得できたファイルを、定期的に別サーバやS3に格納しています。

    redashのクエリのバックアップを取りたい

    redashに登録したクエリをバックアップし、世代管理したい事が多々あります。

    @ariarijp さんが作成した redashman (https://github.com/ariarijp/redashman) というツールが非常に便利です。

    どこでも動くように、という事を念頭に開発されたようでgo言語で作られています。

    定期的に実行し、gitで保存するようにしています。

    redashのメジャーVersion UPをしたい

    オフィシャルの手順はこちらです。

    https://redash.io/help/open-source/admin-guide/how-to-upgrade

    作業前にPostgresのバックアップを取得することを強くお勧めします。

     

    私がVersion UPした際の手順は以下の通りです。

    メジャーバージョンアップを行う場合、DBのスキーマ変更を伴う場合が多いです。

    https://tsukada.sumito.jp/2018/08/08/docker-redash-v5-update/

    redashのマイナーバージョンアップをしたい

    docker-composeでdockerのイメージを切り替えるだけで動く事が多い。

    作業前にPostgresのバックアップを取得することを強くお勧めします。

    https://hub.docker.com/r/redash/redash/tags/

    誰にどのデータを見せるかの制御したい

    様々なロールを持ってる人がredashを使っています。

    単純にKPIを追う人、センシティブな数値を扱う人と様々です。

    残念ながら現段階ではredashではオフィシャルに「見せる・見せない」を制御する機能はありません。

    データソースをもう一つつくり、そちらで制御するようにしました。

     

    https://qiita.com/S-T/items/c0e4bf3929771a30b720

    クエリが詰まる原因を知りたい

    クエリを実行したのに、結果が返ってこない。ということはよくあります。

    いわゆる「クエリが詰まる」という状況です。

    なぜ、どのような理由で詰まるのか。これについては @ariarijp さんのスライドが非常にわかりやすくまとまってます。

    詰まる箇所、つまり、全部。というわけです。

    クエリが詰まった。対処したい

    根本対応ではないのですが、前途したように、redisの中身をdeleteしてます。

    https://tsukada.sumito.jp/2018/08/25/redash-v5%E3%81%A7in-progress%E7%8A%B6%E6%85%8B%E3%81%AE%E3%82%BE%E3%83%B3%E3%83%93%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92kill%E3%81%99%E3%82%8B/

    このような状況に陥った場合は、host側のswapも相当使用している可能性があるのでOSの再起動も合わせて行なってます。

    CLIで操作したい

    「redashのユーザーを作成してください」というのはredashを運用していてとても多いオペレーションです。

    GUIでもよいのですが、エンジニアにとってはCLIでやりたいこともあります。

     

    • ユーザー確認
      docker exec -it redash_server_1 ./manage.py users list
    • ユーザー作成
      docker exec -it redash_server_1 ./manage.py users create  tsukada@sumito.jp tsukada
    • ユーザーパスワード変更
      docker exec -it redash_server_1 ./manage.py users password tsukada@sumito.jp password
      
    • ユーザー削除
    docker exec -it redash_server_1 ./manage.py users delete tsukada@sumito.jp

    ただし、ユーザーに行動履歴があると、削除できません。その場合は履歴情報を削除してからCLIを実施する必要がありました。

    この点はVersion 5から改善され、GUIでユーザーをdisable化できるようになりました。

    そのため、現在弊社ではユーザーを削除するというオペレーションは行なっておりません。

    誰がどのクエリを実行したのか知りたい

    実は全てのクエリはredashのpostgresに保存されています。

    redashにログインし、 /admin に接続すると、管理者用のページが表示されます。

    但し、このページはadminのみアクセスが可能なページです。

    複数のデータソースを結合したい

    データソースAとデータソースBを結合することができます。joinのようなものです。

    Gunosyさんのブログに詳しい使い方が書いてあります。

    簡単にいうと、以下のようなクエリを書き、datasourceにQueryResultsを選択すると結合できます。

    select *
    from query_59 a
    join query_96 b
    where a.member_id = b.member_id;

    Dynamo DBをSQLで操作したい

    DynamoDBはDQLというSQLっぽいんだけど、SQLじゃないオリジナルの言語を使います。これが細かいところに手が届かなかったり、これが馴染みの無い人には辛い。

    QueryResultを経由させてSQLで操作できるようにします。

    https://tsukada.sumito.jp/2018/10/05/redash-query-result-dql/

     

    BigQueryを操作したい

    BigQueryはScan対象のカラムによって課金される。redashは実際に何行読み込み、容量は何kbyteだったのか表示してくれます。親切。

    redashのUserをgitで管理したい

    前途したuser listをCLIで表示させ、gitと連携しユーザの棚卸しを行なっている。

    ただし、Version 5でUserのenable/disable機能が組み込まれたが、CLIで確認することができなかった。一部昨日追記したところ、無事取り込んで戴けました。

    https://github.com/getredash/redash/pull/2951/files

    メリットは以下の通りです。

     

    redashにコントリビュートしたい

    CLIは穴場です。必要なものがまだ実装されておらず、且つ比較的簡単に実装できたりします。

    とはいえ、どのようにはじめたらいいかわからない、という方はぜひredashのdeveloper meeetupにお越しください。

    もくもくを経て、一人一人発表、フィードバックを得れる会です。その為参加人数も絞ってます。プルリク送ってコントリビュートしたい方、是非。

    会場は前回に引き続き、弊社レアジョブです。

    https://redash-meetup.connpass.com/event/110549/

  • jsonにコメントを書く

    jsonにコメントを書く

    はじめに

    Jsonは正式にコメント欄というのがない。しかしコメント重要。なんとかする

    解決策

    “` hjson “` を導入する。

    hjsonは正式にはjsonではないが、コメントついたjson。ちゃんとしたjsonにするには、変換コマンドを通すことにより、正式なjsonへ変換が可能。

    導入

    前提条件としてnodeがインストールされていることが必須。

    npm install hjson -g

    使い方

    hjsonファイルを用意する

    [
    {
      /*
        email  (tsukada@sumito.jp)
      */
      "name": "mailAddress",
      "type": "STRING"
    },
    {
      /*
        realname (TSUKADA SUMITO)
      */
      "name": "realName",
      "type": "STRING"
    },
    {
      /*
        nickname (Smith)
      */
      "name": "nickname",
      "type": "STRING"
    },
    {
      /*
        day (2013/08/03 15:11:00)
      */
      "name": "recordDay",
      "type": "TIMESTAMP"
    },
    {
      /*
        some plans
      */
      "name": "Plan",
      "mode": "REPEATED",
      "type": "RECORD",
      "fields": [
        {
          "name": "optionID",
          "type": "INTEGER"
        },
        {
          "name": "optionName",
          "type": "STRING"
        }
      ]
    }
    ]

    hjsonコマンドでコメントが外れる

    [
      {
        "name": "mailAddress",
        "type": "STRING"
      },
      {
        "name": "realName",
        "type": "STRING"
      },
      {
        "name": "nickname",
        "type": "STRING"
      },
      {
        "name": "recordDay",
        "type": "TIMESTAMP"
      },
      {
        "name": "Plan",
        "mode": "REPEATED",
        "type": "RECORD",
        "fields": [
          {
            "name": "optionID",
            "type": "INTEGER"
          },
          {
            "name": "optionName",
            "type": "STRING"
          }
        ]
      }
    ]
    

     

    リダイレクトをしてコメントを省いたjsonフォーマットに変換することが可能

    hjson -j sample.hjson > sample.json

    参考情報

    https://co.bsnws.net/article/131

     

     

  • AWS S3でフォルダを作成する方法

    AWS S3でフォルダを作成する方法

    はじめに

    AWSにおける作業の大半はawsコマンドで操作できます。

    しかし、画面上にあるはずの「フォルダの作成」については、オフィシャルドキュメントにコマンドが見つかりませんでした。 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/using-s3-commands.html

    S3におけるフォルダという概念

    実はS3においてフォルダという概念は存在しませんが、論理的な階層を暗示するためにキー名のプレフィックスや区切り記号を使用することができます。Amazon S3のデータモデルはフラットな構造を持ち、バケット内にオブジェクトが格納されます。バケット内にはサブバケットやサブフォルダの階層は存在しません。

    https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingMetadata.html

    Amazon S3 のデータモデルはフラットな構造です。バケットを作成し、そのバケットにオブジェクトが格納されます。サブバケットやサブフォルダの階層はありません。ただし、Amazon S3 コンソールで使用されているようなキー名のプレフィックスや区切り記号を使用して論理的な階層を暗示できます。

    S3におけるデータモデルはフラットな構造を持ちます。バケットを作成し、そのバケットにオブジェクトが格納されます。サブバケットやサブフォルダの階層は存在せず、1つのバケットに多数のファイルが格納される形式となります。

    S3におけるフォルダの作成方法

    awsコマンドを使用して、S3上にフォルダを作成する方法を説明します。まずは以下のコマンドを使用して、フォルダを作成するためのキー名を指定します。

    aws s3 cp sample.txt s3://test/sample-folder/

    このコマンドでは、testバケット内にsample-folderという名前のフォルダを作成し、その中にsample.txtをコピーすることができます。複数の環境が.awsディレクトリに登録されている場合は、–profileオプションを使用して読み込むプロファイルを指定することができます。

    参考情報: Amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/

    また、フォルダ内の全てのファイルを再帰的にコピーする場合は、–recursiveオプションを使用します。

    以上が AWS S3でフォルダを作成する方法になります。

  • cronで簡易監視スクリプトを作る

    cronで簡易監視スクリプトを作る

    はじめに

    zabbixやcloudWatchのような”ちゃんとした監視”ではなく、本当にシンプルな値だけを監視して、敷地を超えた場合は通知のみしたいことがある。今回はdisk使用量のみを監視するスクリプトを作った。

    設定

    disk使用率は60%を超えた場合、通知する簡易シェル

    $ df -h
    ファイルシス   サイズ  使用  残り 使用% マウント位置
    devtmpfs         484M   56K  484M    1% /dev
    tmpfs            494M     0  494M    0% /dev/shm
    /dev/xvda1       493G  302G  191G   62% /

    通知の部分は以下の記事を流用する。

    https://tsukada.sumito.jp/2018/11/27/chatwork/

     

    sshでserverにログインし、dfコマンドでxvda1をgrep、必要なところをawkで取得し、sedで%を削除。

    その値をtestコマンドで比較し、true(閾値超え)であればchatworkへ通知する処理がこちら。

    10 12 * * 1-5 test $(/usr/bin/ssh server df | /usr/bin/grep xvda1 | /usr/bin/awk '{print $5}' | /usr/bin/sed -e 's/\%//g') -gt 60 && sh /usr/local/src/server-disk.sh

    単純にプロセスを監視して、プロセスが落ちてたら起動する処理はこちら

    * * * * * ps ax |grep -v grep | grep -q sample.sh || sh /bin/sample.sh