LoginSignup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ruby macでcrontabの設定をしたのですが、何も起きません。

解決したいこと

自分で開発したbotをcronを使って自動実行しようと思い、
https://qiita.com/nd2687/items/204ebfaffa3bad9e2a99
この記事を参考にコーディングしてみたのですが、
どうやらうまく稼働してないみたいです

実際のコード

.記事の内容
0 * * * * cd ’実行したいプログラムがあるディレクトリ'; 'rubyのパス' '実行したいプログラムのパス' 
.ターミナル
% which ruby
↓↓↓↓↓↓↓↓
/Users/kuujoujoutarou/.rbenv/shims/ruby
.crontab -e
* * * * * cd /Users/kuujoujoutarou/twitter_bot; /Users/kuujoujoutarou/.rbenv/shims/ruby Users/kuujoujoutarou/twitter_bot/tweet.rb

※確認しやすいよう毎分動くように設定しました。

tweet.rb
require "twitter"

client = Twitter::REST::Client.new do |config|
    config.consumer_key        = 
    config.consumer_secret     = 
    config.access_token        = 
    config.access_token_secret = 
end

    File.open("tweets.txt", "r") do |bot|
      @bots = bot.read.split("\n")
    end
    tweet = @bots.sample
    client.update tweet

なにとぞよろしくお願いします

なにか間違った書き方をしているのでしょうか?
初心者のためあまりよくわかっていません
教えていただけると幸いです。

0

3Answer

crontab経由で実行する場合、プログラムが動作する場所を注意する必要があります。
解決するためには以下の手順で原因の切り分けをお願いいたします。

crontab -l
* * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb

(1) 手で動かす
ターミナルから以下のコマンドで動作するか確認してください

ユーザの ~ に移動してから実行
% cd
% /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb

(2) 上記で動く場合、実行する場所を変更して確認してください

違う場所に移動してから実行
% cd /
% /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb

もし (1) が動作する、(2) が動作しない場合
tweets.txt がプログラムが実行されている場所に存在しないことが原因と思われます。

修正前
File.open("tweets.txt", "r") do |bot|
           ~~~~~~~~~~ 相対パス

対策は
(1) tweets.txt ファイルをフルパスで指定する

修正後
// ファイルをフルパスで指定する
File.open("/Users/kuujoujoutarou/twitter_bot/tweets.txt", "r") do |bot|

もしくは
(2) crontab 経由で実行する前に tweets.txt の存在する場所に移動してから実行
下記のtweets.shファイルを /Users/kuujoujoutarou/ 配下に設置してください

tweets.sh
#!/bin/sh
cd /Users/kuujoujoutarou/twitter_bot
/Users/kuujoujoutarou/.rbenv/shims/ruby tweet.rb

実行権限を付与すること

ファイルの権限を確認する
% ls -lt tweets.sh
-rw-r--r--  1 xxx xxx 1864  4  2 18:29 tweets.sh

実行権限がない場合は chmod で権限を付与
% chmod a+x tweets.sh

% ls -lt tweets.sh
-rwxr-xr-x  1 xxx xxx 1864  4  2 18:29 tweets.sh

crontabに登録する

crontab -l
* * * * * /Users/kuujoujoutarou/tweets.sh
2

Comments

  1. おはようございます。動作してよかったです。
    返信スレッドが別でしたので自分の投稿にまとめて返信いたします。

    ■ 振り返り/ 問題と対処

    (1) cron に登録したパス情報の間違い

    誤;* * * * * /path/to/ruby path/to/tweet.rb
    正;* * * * * /path/to/ruby /path/to/tweet.rb
    ※第2引数の先頭「/」が抜けている

    (2) cronによる実行履歴の確認方法

    * * * * * /path/to/ruby /path/to/tweet.rb >> /path/to/tweet.log 2>&1
    実行都度ログを出力して確認できるようにする。

    (3) rubyファイルのencode指定漏れ

    tweets.txt ファイル先頭に以下を追加
    # encoding: UTF-8
    ※ 未指定だと環境変数の LANGに依存

    (4) ファイルのパス指定、encode 指定漏れ

    誤;File.open("tweets.txt", "r")
    正;File.open("/path/to/tweets.txt", "r:UTF-8")

    ※ パス未指定だと実行した場所からの相対パス扱いとなる
      cronの場合は "/tweets.txt"
    ※ encode未指定だと環境変数のLANGに依存。
      US-ASCII扱いとなるため明示的にUTF-8 を指定

    ---

    最後の質問;クラウドの選定先、AWS 一択で大丈夫です。

    ・AWS はクラウドコンピューティングのリーダーである
    ・独自のサービスと技術力が他のクラウドプロバイダとは異なる強みを持つ
    ・無料枠があるので 750時間までご利用いただけます・・★←テストに十分

    まだ他にも気になるところがあればこちらの質問は閉じてから
    別で投稿をお願いいたします。
  2. @NetaNeta0620

    Questioner
    大変お世話になりました🙇
  3. こちらこそ。また機会があればよろしくお願いいたします
    ※質問をクローズするボタンがあるので押してください、笑

Comments

  1. @NetaNeta0620

    Questioner
    cdコマンド削除しました
    それと/が抜けていたようなので追加したのですが、稼働しません
    まだなにか問題があるのでしょうか?
  2. @NetaNeta0620

    Questioner
    (1)の修正で(1)手で動かすと(2)場所を変えて動かすはできたのですが、
    crontab -e で* * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rbを入力しても定期実行されません。

     crontab -e
    i(INSERT)
    * * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb
    esc :wq
    の順番が間違っているとかでしょうか?
  3. `shell:crontab
    % crontab -l
    `
    上記を実行して正しく登録されているかをご確認ください。
  4. @NetaNeta0620

    Questioner
    % crontab -l
    * * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb

    結果がこれです。
    記述間違いはないと思うのですが
  5. 実行権限があるかを確認する
    % ls -lt /Users/kuujoujoutarou/.rbenv/shims/ruby

    普段利用している ruby のフルパスを確認する
    % which ruby
    → 差異がある場合は crontab を修正ください

    crondが起動しているかを確認する
    % ps aux | grep cron

    処理実行後の cron.log を確認する
    % tail -f /var/log/cron.log

    実行時にログに何か出力されるようにcrontabを修正
    * * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb > /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1
  6. @NetaNeta0620

    Questioner
    ls -lt /Users/kuujoujoutarou/.rbenv/shims/ruby
    -rwxr-xr-x 1 kuujoujoutarou staff 395 5 24 2022 /Users/kuujoujoutarou/.rbenv/shims/ruby

    which ruby
    /Users/kuujoujoutarou/.rbenv/shims/ruby

    ps aux | grep cron
    root 290 0.0 0.0 33624908 460 ?? Ss 金01PM 0:02.12 /usr/sbin/cron
    kuujoujoutarou 67398 0.0 0.0 33587576 64 s000 R+ 3:10PM 0:00.01 grep cron

    tail -f /var/log/cron.log
    tail: /var/log/cron.log: No such file or directory
    これは自分で追加すればいいのでしょうか?

    修正完了
  7. ありがとうございます。 /var/log/cron.log は追加不要です。

    cron に登録した内容が反映されていれば以下に何か出力されているはずです。

    /Users/kuujoujoutarou/twitter_bot/twitter_bot.log

    ご確認いただけますか。
  8. @NetaNeta0620

    Questioner
    /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `split': invalid byte sequence in US-ASCII (ArgumentError)
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `block in <main>'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:10:in `open'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:10:in `<main>'


    結果がこちらになります
    何かエラーが出ているみたいです。
    なにかわかりますでしょうか?

    コードがこちらになります
    File.open("/Users/kuujoujoutarou/twitter_bot/tweets.txt", "r") do |bot|
    @bots = bot.read.split("\n")
    end
    tweet = @bots.sample
    client.update tweet
  9. ファイルの文字コードに問題があるようです。

    ・tweet.rb の先頭に以下の行を追加、UTF-8で保存する

    # Encoding: utf-8
    ※Eは半角にしてください

    ・tweets.txtも文字コードをUTF-8で保存する


    ・上記で駄目な場合はファイルを開く箇所でUTF-8を指定する

    File.open('/Users/kuujoujoutarou/twitter_bot/tweets.txt', 'r:UTF-8:invalid:replace')
  10. @NetaNeta0620

    Questioner
    Encoding: utf-8
    require "twitter"

    /Users/kuujoujoutarou/twitter_bot/tweet.rb:1: syntax error, unexpected ':', expecting end-of-input
    Encoding: utf-8
    ^

    File.open('/Users/kuujoujoutarou/twitter_bot/tweets.txt', 'r:UTF-8:invalid:replace') do |bot|

    /Users/kuujoujoutarou/twitter_bot/tweet.rb:10: warning: Unsupported encoding UTF-8:invalid ignored
    /Users/kuujoujoutarou/twitter_bot/tweet.rb:10: warning: Unsupported encoding replace ignored
    /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `split': invalid byte sequence in US-ASCII (ArgumentError)
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `block in <main>'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:10:in `open'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:10:in `<main>'

    となってしまいます
  11. @NetaNeta0620

    Questioner
    確認不足でした。
    すみません。

    tweets.txt
    # Encoding: utf-8(1行目)
    -----------------------
    # Encoding: utf-8
    require "twitter"

    /Users/kuujoujoutarou/twitter_bot/tweet.rb:12:in `split': invalid byte sequence in US-ASCII (ArgumentError)
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:12:in `block in <main>'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `open'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `<main>'

  12. tweets.txt を UTF-8の文字コードで保存してください
  13. @NetaNeta0620

    Questioner
    .txtをUTF-8で保存できているかの確認と変換方法がわからなかったため調べてみたのですが、
    http://www.edu.cc.uec.ac.jp/pc/FP07/tips/textedit-code.html
    この手順で合ってるでしょうか?

    % file --mime tweets.txt
    tweets.txt: text/plain; charset=utf-8
    結果がこちらになります

    .log
    /Users/kuujoujoutarou/twitter_bot/tweet.rb:12:in `split': invalid byte sequence in US-ASCII (ArgumentError)
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:12:in `block in <main>'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `open'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `<main>'
  14. cronが正しく動いているのかを確認するため
    crontabを少し確認してみましょう

    * * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1

    ※ >> にしています

    あと先頭の Encoding は小文字にしてください

    # encoding: UTF-8

  15. @NetaNeta0620

    Questioner
    * * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb ※ >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1

    -----------------------------------------------------------------------------

    # encoding: utf-8
    require "twitter"

    -----------------------------------------------------------------------------

    /Users/kuujoujoutarou/twitter_bot/tweet.rb:12:in `split': invalid byte sequence in US-ASCII (ArgumentError)
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:12:in `block in <main>'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `open'
    from /Users/kuujoujoutarou/twitter_bot/tweet.rb:11:in `<main>'
  16. % ls -lt /Users/kuujoujoutarou/twitter_bot/twitter_bot.log

    上記ファイルの更新日時は新しくなっていますか
  17. @NetaNeta0620

    Questioner
    % ls -lt /Users/kuujoujoutarou/twitter_bot/twitter_bot.log

    -rw-r--r--@ 1 kuujoujoutarou staff 2456 4 4 17:06 /Users/kuujoujoutarou/twitter_bot/twitter_bot.log

    になります
  18. ログは新しくなっていますね。
    あとは読み込むファイルをUTF-8の指定ができれば大丈夫。
    'r:UTF-8:invalid:replace'

    'r:UTF-8'
    にするのと

    # encoding: UTF-8
    ENV['LANG'] = 'en_US.UTF-8'
    先頭に上記を追加してみましょう
  19. @NetaNeta0620

    Questioner
    'r:UTF-8:invalid:replace'

    'r:UTF-8'
    に変更したところ投稿できるようになりました!
    これをサーバーかクラウドにあげてpcがスリープ状態でもcronが動く状態にしたいのですが、どうするのがベストでしょうか?
    どのクラウドがいいなどありましたら教えていただきたいです。
crontab -e
* * * * * (略)/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/tweet.rb
                                  ^ ここのスラッシュが抜けています
0

Comments

  1. @NetaNeta0620

    Questioner
    直しましたが変化がありません
    それとcdコマンドも削除しましたが動きません
    まだ間違いがあるのでしょうか?

Your answer might help someone💌