Jadi, saya memiliki aplikasi yang berfungsi dengan Permata Kapanpun untuk menjalankan tugas terjadwal. Dan kemudian, saya memiliki tugas yang melakukan permintaan posting dengan RestClient, dan itu berfungsi dengan baik ketika saya menjalankannya sendiri dengan "rake" di terminal. Tetapi ketika tugas dijalankan melalui pekerjaan cron, itu tidak berhasil. Permintaan posting terlihat seperti ini:

    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)

Seperti yang saya katakan, ketika menjalankan tugas ini dengan perintah rake manual, itu berfungsi dengan baik. Ketika tugas dijalankan oleh cronjob, ia mengembalikan kesalahan ini:

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>'

Jadi, saya mencoba meneruskan url langsung di kode tugas, masih ada kesalahan:

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>'

Apa yang harus saya lakukan? Tidak tahu mengapa ini tidak berfungsi karena berfungsi dengan baik dengan perintah rake manual. Saya akan sangat menghargai bantuan apa pun, terima kasih sebelumnya.

Sunting¹.:

Saya mencoba mengajukan pengecualian untuk memeriksa secara spesifik apa yang terjadi dengan 400 Permintaan Buruk ini. Dan inilah yang saya dapatkan:

 { 
    "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! 

Yang masih tidak masuk akal, karena berfungsi ketika tugas dijalankan secara manual, jadi klien harus valid

0
p-arth 7 Desember 2020, 22:35

3 jawaban

Jawaban Terbaik

Terima kasih kepada @anothermh saya berhasil mengetahui bahwa cron tidak mengakses variabel ENV karena alasan apa pun, masih tidak tahu mengapa.

Tapi, karena saya menggunakan permata dotenv, apa yang dimaksud dengan latihan adalah menggunakan sintaksnya sendiri untuk tugas-tugas (saya tidak harus melakukan itu sebelumnya, tapi sekarang saya melakukannya, belum tahu mengapa). Yang melakukan sesuatu seperti ini di awal setiap tugas, untuk memastikan file .env sedang dimuat "secara manual":

require 'dotenv/tasks'

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

Anda dapat memeriksa lebih lanjut di halaman dotenv github sendiri. Terima kasih untuk mereka yang mencoba membantu! https://github.com/bkeepers/dotenv

0
p-arth 7 Desember 2020, 22:29

Pengguna yang menjalankan tugas menyapu tidak memiliki variabel lingkungan yang disetel di ENV. Itu sebabnya Anda mendapatkan kesalahan yang berbeda (400 Permintaan Buruk) saat Anda memasukkan URL secara langsung.

Dalam kasus pertama tidak ada vars ENV sama sekali. Dalam kasus kedua Anda telah memasukkan URL (dan dengan demikian dapat membuat permintaan dan menerima tanggapan) tetapi Anda telah meninggalkan semua vars lain yang mengakibatkan server mengatakan Anda telah membuat permintaan yang buruk.

Solusinya adalah teruskan ENV vars untuk pengguna yang menjalankan ruby atau hardcode nilai Anda dalam skrip.

1
anothermh 7 Desember 2020, 20:26

Apakah Anda menggunakan jalur file absolut? Saya tidak tahu apa-apa tentang rake tetapi saya mengacaukan setiap cronjob yang saya jadwalkan karena menggunakan jalur file relatif dalam tugas cron dan dalam skrip yang dijalankannya. Sepertinya itu menemukan rake yang dapat dieksekusi, tetapi bukan skrip yang Anda coba jalankan.

Misalnya untuk menjadwalkan pekerjaan cron untuk skrip python pada jam 12 pagi setiap hari menggunakan jalur file absolut:

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

Juga, pastikan jalur file di dalam skrip juga absolut (cron tidak menjalankan skrip dari direktori itu).

0
Jeff Schulz 7 Desember 2020, 20:19