簡體   English   中英

Rest POST 在 CRON 任務中不起作用(它適用於手動 rake 命令)

[英]Rest POST not working in CRON task(it works with manual rake command)

所以,我有一個應用程序可以與Whenever Gem 一起執行計划任務。 然后,我有一個使用 RestClient 執行發布請求的任務,當我在終端上使用“rake”自己執行它時,它工作正常。 但是當任務通過 cron 作業執行時,它不起作用。 發布請求如下所示:

    urlOAuth = ENV['URL_AUTH']
    client_id = ENV['CLIENT_ID']
    client_secret = ENV['CLIENT_SECRET']

    data = {
      grant_type: 'client_credentials',
      scope: 'read-data',
      client_id: client_id,
      client_secret: client_secret
    }

    result = RestClient.post(urlOAuth, data)

正如我所說,當使用手動 rake 命令執行此任務時,它工作正常。 當任務被 cronjob 執行時,它返回這個錯誤:

rake aborted!
ArgumentError: must pass :url
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:79:in `initialize'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:63:in `new'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:63:in `execute'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient.rb:70:in `post'
/root/micro-app-api-idfm/lib/tasks/get_send_json.rake:22:in `block in <main>'
/usr/local/rvm/gems/ruby-2.6.5/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.6.5/bin/ruby_executable_hooks:24:in `eval'
/usr/local/rvm/gems/ruby-2.6.5/bin/ruby_executable_hooks:24:in `<main>'

所以,我嘗試在任務代碼中直接傳遞url,還是報錯:

rake aborted!
RestClient::BadRequest: 400 Bad Request
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/abstract_response.rb:249:in `exception_with_response'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/abstract_response.rb:129:in `return!'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:836:in `process_result'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:743:in `block in transmit'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:727:in `transmit'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:163:in `execute'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient/request.rb:63:in `execute'
/usr/local/rvm/gems/ruby-2.6.5/gems/rest-client-2.1.0/lib/restclient.rb:70:in `post'
/root/micro-app-api-idfm/lib/tasks/get_send_json.rake:22:in `block in <main>'
/usr/local/rvm/gems/ruby-2.6.5/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/usr/local/rvm/gems/ruby-2.6.5/bin/ruby_executable_hooks:24:in `eval'
/usr/local/rvm/gems/ruby-2.6.5/bin/ruby_executable_hooks:24:in `<main>'

我應該怎么辦? 不知道為什么這不起作用,因為它可以與手動 rake 命令一起正常工作。 我會很感激任何幫助,在此先感謝您。

編輯¹。:

我嘗試提出一個異常來具體檢查這個 400 Bad Request 發生了什么。 這就是我得到的:

 { 
    "error" : "invalid_client",
    "error_description" : "Client authentication failed (e.g. unknown client, no client authentication included, or unsupported authentication method). The authorization server MAY return an HTTP 401 (Unauthorized) status code to indicate which HTTP authentication schemes are supported. "
  }
rake aborted! 

這仍然沒有意義,因為它在手動執行任務時工作,所以客戶端應該是有效的

運行 rake 任務的用戶沒有在ENV中設置環境變量。 這就是為什么當您直接傳入 URL 時會收到不同的錯誤(400 Bad Request)。

在第一種情況下,根本沒有ENV變量。 在第二種情況下,您已經傳遞了 URL (因此可以發出請求並接收響應),但是您忽略了所有其他變量,這導致服務器說您發出了錯誤的請求。

解決方案是為運行ruby的用戶傳入ENV變量,或者在腳本中硬編碼您的值

您是否使用絕對文件路徑? 我對 rake 一無所知,但由於在 cron 任務和它運行的腳本中使用了相對文件路徑,我安排的每個 cronjob 都搞砸了。 似乎它正在查找 rake 可執行文件,而不是您嘗試執行的腳本。

例如,使用絕對文件路徑在每天上午 12 點為 python 腳本安排 cron 作業:

* 0 * * * /usr/bin/python3 /home/user/file

另外,確保腳本中的文件路徑也是絕對的(cron 沒有從該目錄運行腳本)。

感謝@anothermh,我設法發現 cron 出於某種原因沒有訪問 ENV 變量,但仍然沒有找出原因。

但是,由於我使用的是dotenv gem,所以鍛煉是使用它自己的任務語法(我以前不必這樣做,但現在我這樣做了,還不知道為什么)。 在每個任務開始時都會執行類似的操作,以確保“手動”加載 .env 文件:

require 'dotenv/tasks'

task mytask: :dotenv do
    # things that require .env
end

您可以在自己的 dotenv github 頁面中查看更多信息。 感謝那些試圖提供幫助的人! https://github.com/bkeepers/dotenv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM