質問: Rubyで定刻にirkitを操作してホームオートメーションを実現したいと考えています。 指定した時刻に実行するのは`gem "clockwork"`で出来るようですが、`clockworkd -c clock.rb start`とdaemonかフォアグラウンドプロセスを動かす必要があり当然ながらclock.rbを編集しただけではスケジュールは反映されません。 `clockworkd -c clock.rb restart`としてやれば反映されましたがclockworkに限らず他の方法はないでしょうか? シェルコマンドを実行せずにWeb側のrackup時に別スレッドで立ち上がりrubyのコードでスケジュールの追加、削除、変更が出来るようなイメージです。
回答: のソースコードを見てみましたが、次のような作りでした。 1. clock.rbはbin/clockworkd内で単純に`require`されている。(再読み込みは想定されていない) 2. clockworkはシグナルINT、TERM、HUPを受け取れるがどれらも終了(shutdown)または緩やかに終了(graceful_shutdown)であり、restartやreloadはない。そもそも管理クラスである`Clockwork::Manager`にそのような機能がない。 clockworkdはdaemonsを使ってデーモン化していますが、restartでの動作は、新しいclock.rbを`require`してから、以前のプロセスの終了、そして、新しいプロセスでの`Clockwork.run`実行としているようです。結論から言うと、`clockworkd -c clock.rb restart`とデーモン再起動する以外の方法で新しいclock.rbを読み直す方法はありません。言い換えれば、既に実行されているプロセスで読み直せるような作りにclockwork自体が作られていないのです。 rackup内でsystem等を用いて`clockworkd -c clock.rb start`としているのだと思いますが、clock.rbが書き換わったら、同じように`clockworkd -c clock.rb restart`するぐらいしか対応方法は無いと思われます。