cron実行スクリプトの多重起動防止ワンライナー

cron実行スクリプトの多重起動防止ワンライナー、これでええやん

ジョブの多重実行問題

よくこんな感じで1分おきにジョブを流したい場合があると思う。

ところがこのcron_job.rbが1分以内に処理が終わらない場合、1分後には同じスクリプトが2重で起動されてしまう。

これは良くないので、多重起動の防止策が必要ねというのがそもそもの課題。

多重実行防止方法

cron_job.rbの内部ロジックとして、多重実行を防ぐ

ジョブのスクリプト内に、DBのstatusカラム(0:未実行, 1:実行中, 2:実行完了)を作成して、statusを参照することで多重起動防止する。

というような施策を行うことがあるが、これが機能しないとバグになるし、ジョブ起動の管理はスクリプト本体からは切り離したい。というかそもそも毎回そんな処理を書き足すのが面倒くさい。

cron_job.rbプロセスの実行状況を確認して、多重実行を防ぐ

こういうケースではジョブの実行開始時にロックファイルを作成して、ロックファイルがあったら後追いのcronでは実行しちゃだめよーという方法がポピュラーらしいが、なんか面倒に感じる。

ということで、簡単な方法を求めていたら、pidofコマンドを使ってジョブの実行状況を確認する方法だとワンライナー的に書けて一番便利そう。これでええやん。

ワンライナーの説明

  • 「||」の左辺がプロセスの実行状況確認、右辺が実際のスクリプト。
  • pidofは-xオプションを付けないと、自作スクリプトなどのプロセスの存在を検出してくれない。
  • pidofはプロセスが1つ以上存在する場合は0以外のリターンコードを返す。
  • 「||」は左辺が0意外なら右辺を実行する

一応テストしてみる

処理終了に1分以上(70秒)かかるスクリプトを作成した。

多重実行防止「無し」で試す

これを1分おきのcronで定期実行し、ジョブの開始と終了をlogに保存する。

多重実行防止があれば同じプロセスID(pid)のstart, endが交互に来るはず。

が、crontabに多重実行防止の処理を入れてないので結果は以下のようにあちゃーとなる。別プロセスIDのstartとstartが連続して続いていることから、思いっきり2重に起動している。

多重実行防止「有り」で試す

ここで、例のcron多重起動防止ワンライナーを使ってみる。これでどーでしょー!!

一点注意なのはcron実行ユーザーの環境変数のせいか、pidofをcronで使うと、そんなコマンドは無いと怒られます。たぶんパスが通ってないようです。なので、crontabでpidofを使う際は、/usr/sbin/pidofと絶対パスで指定してください。

結果は素晴らしい!きちんと同じプロセスIDのstart, endが交互に来てます。多重実行が防止できていることがわかる。

簡単につかえて、これでええやん。( ´_ゝ`)ノ

RubyからLine NotifyでLineにメッセージを送るかんたん手順

RubyからLine NotifyでLineにメッセージを送るかんたん手順

※こちらがキャプチャ画像有りの詳細手順です。こちらも合わせてご参照どうぞ

アクセストークンの取得

Line Web管理画面にログイン

まずは、以下のLineのWeb管理画面に進む。ログインID&PassはLineアプリにログインする際のもの。

https://notify-bot.line.me/my/

Line notify アクセストークン発行

トークン名、トークルームを選択

続いて、Lineへのメッセージ送信の際の通知名や、送信先チャットルーム(トークルーム)を選択します。自分宛なので、「1:1でLINE Notifyから通知を受け取る」でいいかと。

続いて、「発行する」をクリックでトークンが発行されるので、トークン文字列をコピーしておきます。

Line notify botのチャットルーム選択画面

とりあえずcurlで送信テストする

発行したトークンIDで正常に送信できるかcurlでメッセージを送って確かめます。

詳細はLine Notify APIドキュメントの3ページ目下段「通知系」の章を参照します。

bash

200 OKが返ってくれば、スマホのLineにメッセージが届いてるはずです。

こんな感じで届きます。

スマホに届くメッセージ画面

Rubyで送信スクリプトを作成する

あとはcurlで成功したPOSTリクエストをRuby的に再現してあげます。以下のスクリプトのトークン文字列だけ入れ替えてあげれば、すぐ動くはずです。かんたんやー。

send_msg_with_line_notify.rb

こんな感じで実行

bash

Please call my APIs.というクイズが解けたよ

一昔前に流行ったそうですが、「Please call my APIs.」というWeb上のクイズを解きました。

(´Д`)ハァハァ・・・

ヒントはほぼ無しで、以下の画像の画面を見て何かしらのアクションをすると、正解かどうか回答が返ってくるというもの

ググっても丸々回答というのは無いと思うので、むしろググるのは解決方法(主にRESTの呼び方)、皆さんもやってみてくださいませー。

P.S. Winner欄で僕だけNo.が未記入になってる…。No.は自動インクリメントで記入だと思ってたのに…

Please call my APIs.

Rails4ブロンズ試験に合格したのでシルバーも受けます

Rails4ブロンズ試験に合格したのでシルバーも受けます

Rails4技術者認定ブロンズ試験に合格しました

Rails技術者認定試験というのは、Rails技術者認定試験運営委員会という組織で運営されているRailsの技術検定です。

この検定は有料試験ですので、ブロンズが10,000円、シルバーが12,000円の受験料を支払って受験をします。通常は。

“Rails4ブロンズ試験に合格したのでシルバーも受けます”の続きを読む

[2016最新版]Google SheetsにRubyプログラムからアクセス・書き込みを行う手順

だんだんMicrosoftの陰が薄くなってきている昨今、Excelを使わない人も増えてきていると思います。特にエンジニア界隈ではGoogle Sheets(旧Google SpreadSheet)の使用率が増加傾向にあるのではないかと。(もしくは様々なツール・アプリの登場で、表計算ソフト自体が使われなくなってきてますかね。)

そんな時代だからこそ、プログラムからGoogle Sheetsにデータを自動記入して、毎日の定型作業を楽にしたいな♪という欲求も生まれるもの。ということで、RubyからGoogle DriveのOAuth認証を経由して、Google Sheetsに書き込みをする方法について書いていきたいと思います。

“[2016最新版]Google SheetsにRubyプログラムからアクセス・書き込みを行う手順”の続きを読む

クリスマスにRaspberry Pi 2 model Bがやってきた![2016年]インストール〜初期設定完全メモ with Mac

サンタクロースはあらゆる人の深層心理を読み解くメンタリスト。どんなニーズでも読み取って、ある人にはアクセサリー、ある人には最新ゲーム、織田裕二には世界陸上を、そして、セキュリティエンジニアにはハッカーを描いたアメリカの人気ドラマMR.ROBOT(正月にイッキ見しました。。)を、届けてくれる、最高にできたおじいさんです。

そんなサンタさんが僕にRaspberry Pi2 model B(最新のラズベリーパイです!)を届けてくれましたので、お正月休みを利用して早速開封して初期設定をしていきますので、ついでにメモ。

“クリスマスにRaspberry Pi 2 model Bがやってきた![2016年]インストール〜初期設定完全メモ with Mac”の続きを読む

Nokogiriのchildrenメソッドでpタグの1行を取得する方法

正規表現で行末まで取得ができない場合は、Nokogiriのchildrenメソッドで該当行を探す

こういうNokogiriのElementが存在する。pタグで囲んでテキストの文章を書きながら、<br>で改行をいれていく普通の文章。

取得したい文章は以下の駅名一覧

正規表現で「出発駅」から行末まで取ってくればいいだろうと考えるが、

全部でちゃった(ノω・)

どうもdoc.css("p").first.textとtextメソッドを使うと、HTML中の改行(<br>ではなく、キーボードから打ち込んだ改行)を無視して全ての文章を繋げて一つのtextとするみたい。

なので、おとなしくchildrenメソッドでpの子要素それぞれを見ながら、目的の行を発見したら任意の処理をしてbreakという方法で乗り越えました。

RubyのActiveRecord単体使用でDB(MySQL)のデータ読込み・追加・更新・削除する方法

Ruby on Railsに組み込まれているモデル操作用(DB操作用)のライブラリといえばActiveRecordですが、これをRailsを使わずにRubyとActiveRecord単体の組み合わせで使ってみたいと思います。

phpMyAdminでダミーのデータベースを作成する。

早速ダミーのデータベースとテーブル作成でつまづいた。よく考えると、チュートリアルや本の写経でテーブル作成したことはあったが、自分で一から作るのは初めてでした。

なので、テーブル作成の時に以下のような初歩的っぽいエラーがたくさん出ました(T_T)

  • エラー#1063:「id」にauto incrementをつけた状態では、型をINT系にしなければいけない。(最初VARCHARにしてた。) <参考>
  • エラー#1293:テーブル内でデフォルト値がCURRENT_TIMESTAMPにできるのは1つだけらしい。createdとmodifed両方にCURRENT_TIMESTAMPを付けていたのを、createdのみにした。<参考>

“RubyのActiveRecord単体使用でDB(MySQL)のデータ読込み・追加・更新・削除する方法”の続きを読む

スクレイピング取得した記事更新日付を、正規表現でDB格納用の日付フォーマットに整形する

前回書いたnokogiriを使ったRubyでのWebスクレイピングの初級編に続いて記事の更新日付を取得しますが、CSSメソッドを使えば同じ手順で簡単に習得できます。ただ、日付のフォーマットが「2015年09月29日 13時12分」となっているのを、データベースのDATETIME型で管理しやすいように「2015/09/29 13:12」という日付フォーマットに整形してあげるほうが望ましいです。

“スクレイピング取得した記事更新日付を、正規表現でDB格納用の日付フォーマットに整形する”の続きを読む

RubyのスクレイピングライブラリNokogiriの使い方チュートリアル

RubyのプログラミングやUnitテストの書き方も少しづつ分かってきたので、少し応用編でRubyを使ったWebスクレイピングをしてみようと思います。スクレイピングというのは、どこぞのWebサイトで公開されているコンテンツを、プログラミングを使って手元にガポッと取ってくるというあれです。

まず、Nokogiriを手元のMacbook Airにインストールする

公式サイトのインストール方法説明を参考にします。例の通り英語サイトですが、最近意識して英語読むようにしてるので、アレルギー無く読めるようになってきました。

“RubyのスクレイピングライブラリNokogiriの使い方チュートリアル”の続きを読む