動かざることバグの如し

近づきたいよ 君の理想に

cronでnohupバックグラウンド処理を実行したい

やりたいこと

SSHでサーバーにログインして以下のようなコマンドを叩くとする。

nohup some_command &

するとnohupコマンドにより、SSHを切断してもsome_commandの処理はバックグラウンドで動き続ける。

これをcronで自動実行したい

かきかた

そのまま書くのはダメで

some_command >/dev/null 2>&1 &

と書かなければならない。

ポイントは2つあって

  • nohupはいらない
  • コマンドの後ろに >/dev/null 2>&1 が必要

なぜかって言うとcronの仕様らしく、

crontab により実行されたコマンドから出力が行われると、 cron デーモンは通常その出力結果を登録されたメールアドレス宛に配送します。 そのため、cronスクリプトがバックグラウンドで行われていても、そのプロセスがopenしているファイルディスクリプタがcloseされない限り、cronは次の処理に移行しないのです。

だそうです。とりあえずうまく行ったからいいや(

参考リンク

RubyでDateTimeの差を秒単位で取得する

DateTimeはあくまで日ベースなので単純には秒の差が取得できない

方法1

(DateTime - DateTime)はRationalになるので、1日を秒に変換した、「24 * 60 * 60」をかけて秒に変換する

require "date"

date1 = Date.today
date2 = Date.today - 3
puts ((date1 - date2)* 60 * 60 * 24).to_i
=> 259200

方法2

先にTime型に変換してTime-Timeで秒を取得する

require "date"

date1 = Date.today
date2 = Date.today - 3
puts (date1.to_time - date2.to_time).to_i
=> 259200

どっちがいいんだろう

RailsのflashメッセージをBootstrapで表示したい

Bootstrapではalertというクラスが用意されている。

<div class="alert alert-primary" role="alert">
  This is a primary alert—check it out!
</div>
<div class="alert alert-secondary" role="alert">
  This is a secondary alert—check it out!
</div>
<div class="alert alert-success" role="alert">
  This is a success alert—check it out!
</div>
<div class="alert alert-danger" role="alert">
  This is a danger alert—check it out!
</div>
<div class="alert alert-warning" role="alert">
  This is a warning alert—check it out!
</div>
<div class="alert alert-info" role="alert">
  This is a info alert—check it out!
</div>
<div class="alert alert-light" role="alert">
  This is a light alert—check it out!
</div>
<div class="alert alert-dark" role="alert">
  This is a dark alert—check it out!
</div>

これをRailsのflashといい感じに混ぜたいって話

環境

  • Rails 5.1
    • 相当古くなければどのバージョンでもいけるはず
  • Rails内でBootstrapが使えるようにしておくこと

設定

まず今回のキモのadd_flash_types

ApplicationController(app/views/layouts/application.html.erb)にadd_flash_typesを以下のように追加

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  add_flash_types :success, :info, :warning, :danger
end

次はビューの設定。app/views/layouts/application.html.erbのbody内に以下を追加

<% flash.each do |name, msg| %>
  <div class="alert alert-<%= name %>">
    <%= msg.html_safe %>
  </div>
<% end %>

使いかた

redirect_to posts_path, success: '投稿に成功しました!'

マジでかんたんだは

参考リンク

Rubyでファイル一覧を作成日時順に取得する方法

ファイル一覧取得自体はDir.globでできるので、

それをsort_byを使ってファイル更新日時順にソートすればおk

Dir.glob("/data/*.json").sort_by{ |f| File.mtime(f) }.each do |file|

end

ただこのやり方だとファイルの数だけFileオブジェクトが生成される(多分)ので何十万件といった一覧を処理するには向いてないかも