0

crontabで日本語を使うのにLANGを設定し忘れてた

LANG=ja_JP.UTF-8
をcrontabの上の方に書いておけば良かった

書かないと、Rubyの場合ARGVに日本語を渡してcrontabから呼んだらencodingのエラーになる

incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)



crontabで定期的に時刻を読み上げる

これを動かそうとしていた
crontabで実行した時だけ引数に日本語渡せなくて困ってた

say-time
#!/usr/bin/env ruby
now = Time.now
s = now.min == 0 ? "#{now.hour}時" : "#{now.hour}時#{now.min}分"
cmd = "say #{s} #{ARGV.join ' '}"
puts cmd
system cmd

30分ごとに実行
SHELL=/usr/local/bin/zsh
HOME=/Users/sho
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/$HOME/bin:$PATH
LANG=ja_JP.UTF-8

0,30 * * * * say-time です -o otoya > /dev/null 2>&1
時刻の末尾に付けたい文字列や、sayに渡したいオプションはそのまま渡せる。
「8時30分です」とか言ってくれる。

0

Ubuntu12.04にrbenvインストールして、crontabやdaemontoolsも設定した

さくらVPSのUbuntu12.04のrvmをrbenvに切り替えた

関連

mac版
橋本商会 » rvmからrbenvに乗り換えた
橋本商会 » crontabでrbenvのrubyを使う

準備


先にrubyをbuildするのに必要なaptを入れる(先にrvmを使っていたのでこれは必要なかったが)
sudo apt-get install build-essential libreadline-dev libssl-dev


rvmを消す
rvm seppuku
sudo rm -rf ~/.rvm


ホームディレクトリにrbenvを入れる


rbenvはaptにもあるけどruby-buildが無いので両方githubからcloneした。
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
mkdir ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build


rbenvへのパスを通す。 ~/.zshrc に書けばいい・・
export PATH=$PATH:$HOME/.rbenv/bin
eval "$(rbenv init -)"
と思いきや、screenを起動したりzsh上でzshを起動するとrbenvのパスより上に /usr/local/bin 等が来て、system rubyが使われてしまう現象が起きた。

rbenvのissueやドキュメントを確認したり調べてみると
Unix shell initialization · sstephenson/rbenv Wiki
インストールしたてのUbuntu12.04では /etc/zsh/zshrc や /etc/zlogin がPATHをいじってた。
一番最後にロードされるらしい ~/.zlogin にrbenvの設定を書いたらscreen上でもrbenvが正しくロードされた。


ruby 2.0.0インストール
rbenv -v
rbenv install --list | grep 2.0
rbenv install 2.0.0-p0


デフォルトでruby2.0使うようにする。
rbenv global 2.0.0-p0
rbenv rehash
ruby -v
2.0になってればok


gemをアップデートしたり、自動rehashするrbenv-rehashを入れたり
gem update --system
rbenv rehash
gem install rbenv-rehash bundler
rbenv rehash


jrubyもインストールする
rbenv install jruby-1.7.3


jrubyのソースコード置いてある場所でだけ、ruby2.0からjruby1.7に切り替えるようにする
cd ~/src/jruby
rbenv local jruby-1.7.3
rbenv rehash
ruby -v
jrubyになっていればおk


rubygemとbundlerをアップデートしたり、自動的にrehashするようにする。
gem update --system
rbenv rehash
gem install rbenv-rehash bundler
rbenv rehash
このディレクトリの下でだけjrubyが使われるようになる。


crontabでrbenvのrubyを使う


crontabの上の方で、PATHの先頭に ~/.rbenv/shims を入れる。
あとはアプリのディレクトリまでcdしてからrubyを使うようにすれば、ちゃんとGemfileも.ruby-vesionも読んで実行してくれる。
HOME=/home/shokai
PATH=/home/shokai/.rbenv/shims:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/shokai/bin

*/15 * * * * cd $HOME/src/ruby/twitter-change-profile && ruby change-profile.rb
*/20 * * * * cd $HOME/src/jruby/glitchicon && ruby bin/create_icon.rb $HOME/shokai.png /var/tmp/glitch_icon.png && ruby bin/upload.rb /var/tmp/glitch_icon.png
jruby使うアプリもちゃんとrbenv切り替えて実行してくれてた。


事前にcrontab上でrbenvが正しく動くかを確かめたほうがいい。
* * * * * echo $PATH > $HOME/cron-path.txt
* * * * * ruby -v > $HOME/cron-ruby-version.txt
* * * * * cd $HOME/src/jruby && ruby -v > $HOME/cron-jruby-version.txt
こういうの登録したらホームディレクトリに環境変数とか書き出す。
なんだか知らんが、Macではできるのに、PATHへの代入の右項に$HOMEとか書いても変数展開されない現象が起きてた。


daemontoolsでrbenvのrubyを使う


daemontoolsはlogが確認しやすいので楽。

http://dev.shokai.org:4000 の起動スクリプト。
cronと同じようにパスの先頭にshimsを追加すればいい。

/etc/service/rocketio-chat/run
#!/bin/sh
exec 2>&1
exec setuidgid sho bash -c '
HOME=/home/shokai
PATH=$HOME/.rbenv/shims:$PATH
cd $HOME/src/sinatra/rocketio-chat-sample
WS_PORT=18080 rackup config.ru -p 4000
'

2

crontabでrbenvのrubyを使う

関連 crontabでRVMのRubyを使う

crontabの頭で環境変数PATHに ~/.rbenv/shims を入れておけばおk


うちではこんなふうになっている

SHELL=/usr/local/bin/zsh
HOME=/Users/sho
PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/$HOME/bin:$PATH
PATH=$HOME/.rbenv/shims:$PATH

## この下にcrontabが書かれている


ちゃんと切り替えれているか確認

ruby -vでバージョンがでるので、
* * * * * ruby -v > $HOME/ruby_version
と書いておけばホームディレクトリにruby_versionというファイルが毎分書き出される
これがrbenvでglobal設定したrubyになっているか確認する。
ちゃんとPATHに $HOME/.rbenv/shims が追加できていれば2.0.0とか書き込まれる。



ディレクトリ毎の確認

rbenv local 1.9.2-p320
でそのディレクトリに .ruby-version というrbenvの設定ファイルができる
これがあると、そのディレクトリに入ったらrbenvが切り替わる。


また、rbenv-rehashというgemを入れておけば自動的にrehashしてくれる。
gem install rbenv-rehash


1.9.2にだけarduino_firmata gemを入れて、ディレクトリ毎にrbenv切り替えがcrontab上でも有効なのか試す
mkdir ~/tmp/1.9.2
cd ~/tmp/1.9.2
rbenv local 1.9.2-p320 # .ruby-versionが生成される
gem install arduino_firmata
arduino_firmata -v

で、crontabに書く
* * * * * arduino_firmata -v > $HOME/arduino_version
* * * * * cd $HOME/tmp/1.9.2 && arduino_firmata -v > $HOME/tmp/1.9.2/arduino_version

ホームディレクトリではrbenvのglobaで設定されているRuby2.0.0が使われたので、arduino_firmata gemがインストールされていなくてコマンド実行失敗していた。
tmp/1.9.2にcdした方はちゃんとRuby1.9.2に切り替わっていて、gemで入れたarduino_firmataコマンドへのパスも通っていた。
tmp/1.9.2/arduino_versionには ArduinoFirmata v0.2.8 と書かれていた。


cronで使うまとめ

アプリのディレクトリ毎に
  • crontabの一番上で PATH=$HOME/.rbenv/shims:$PATH
  • アプリ毎にGemfileを作ってbundlerでgem管理
  • アプリのディレクトリに .ruby-version作って、rbenvのバージョンも合わせる
  • アプリのディレクトリにcdで移動してから実行

これで複数バージョンのRubyをcrontabで使える。

0

crontabでRuby動かしたら private method `require’ called for Bundler:Module

cronでbundler.require使ってるRubyスクリプトを動かした時に出たエラー。何の事かわからなくて6時間ぐらい悩んだ。


こういう構成で

.
|-- Gemfile
|-- Gemfile.lock
`-- main.rb


main.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'bundler/setup'
Bundler.require


crontabから実行
0 * * * * /usr/bin/ruby /home/shokai/src/ruby/main.rb


こんなエラーがでた
private method `require' called for Bundler:Module

Bundler.requireはカレントディレクトリかそこより上にGemfileがあったらその中身をrequireするので
0 * * * * cd /home/shokai/src/ruby && /usr/bin/ruby main.rb
こうしたら動いた。


最終的にcronこうなってる
SHELL=/usr/bin/zsh
PATH=/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/shokai/bin:$PATH

0 * * * * cd /home/shokai/src/ruby && ruby main.rb

0

wp-shotでWordPress2.5にmoblog環境を作る

wp-shotはWordPressに最初から入っているwp-mail.phpが強化された感じのプラグイン。POPでメールアカウントにアクセスして、新着メールを記事として投稿するのは同じだけど、さらに添付した画像をimgタグで表示する機能が付いてる。

wp-shotをダウンロードしてきて解凍、wp-content/pluginsのフォルダ下に置く。

wp-shotフォルダは何か適当に名前を変えた方がいい。

dashboardでプラグインを有効化する

設定は、wp-mail.phpと同じ設定を読み込んでいる。

dashboardで、設定→投稿設定→メールでの投稿 から設定できる。

10分おきに動作するようにcronを登録する。

crontab -e*/10 * * * * /usr/local/bin/php /home/shlog/www/blog/wp-content/plugins/wp-shot/wp-shot.php

crontab -l

で登録されているのを確認しておわり。