mengeksekusi skrip sh dari cron

12

Saya punya skrip test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

ketika saya menjalankan file sebagai root dari baris perintah berfungsi.

sh /home/v/test.sh 

ketika saya mengaturnya ke crontab -e (adalah root cron), tidak berfungsi

 * * * * * sh /home/v/test.sh

Apa yang saya lakukan salah? Terima kasih

Elzo Valugi
sumber
"tidak bekerja" tidak bekerja. Lihat? Anda tidak tahu apa yang saya maksud, dan sepertinya kita tidak tahu apa yang Anda maksud. Maksud saya (ya) apa yang tidak berfungsi? Bisa tentang apa saja. Mungkin tebakan tmow itu benar, tapi itu hanya tebakan (dan menurut saya cukup bagus, tapi tetap saja).
Jürgen A. Erhard
Ya, jika Anda dapat lebih spesifik dengan hasil apa yang Anda lihat, kami akan lebih dapat menentukan apa masalahnya. Yaitu, apa maksudmu "tidak bekerja" (:
gabe.
Saya tidak melihat ada log di syslog, dan skrip melakukan beberapa menyisipkan ke dalam db yang tidak terjadi, dan mereka senang jika saya menjalankan skrip dengan tangan.
Elzo Valugi

Jawaban:

15

Menurut pria itu:

Daemon cron memulai subkulit dari direktori HOME Anda. Jika Anda menjadwalkan perintah untuk dijalankan ketika Anda tidak masuk dan Anda ingin perintah dalam file profil Anda dijalankan, perintah tersebut harus secara eksplisit membaca file .profile Anda.

Daemon cron menyediakan lingkungan default untuk setiap shell, mendefinisikan HOME, LOGNAME, SHELL (= / usr / bin / sh),
dan PATH (= / usr / bin).

Jadi cron daemon tidak tahu di mana php berada dan Anda harus menentukan path php lengkap dengan tangan, misalnya (Saya tidak tahu jalur PHP asli Anda):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Cara lain adalah dengan mencari / etc / profile (atau .profile / .bashrc) Anda, misalnya

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Ini berguna jika .bashrc Anda mengatur variabel lingkungan yang Anda butuhkan (yaitu PATH)

EDIT

Bacaan yang menarik adalah " Newbie: Intro to cron ", jangan meremehkan artikel dari judul (Ini bacaan untuk semua orang), bahkan itu ditulis dengan lengkap dan menjawab pertanyaan Anda dengan sempurna:

...
PATH berisi direktori yang akan berada di jalur pencarian untuk cron misalnya jika Anda punya program 'foo' di direktori / usr / cog / bin, mungkin ada baiknya menambahkan / usr / cog / bin ke path, karena itu akan menghentikan Anda harus menggunakan path lengkap untuk 'foo' setiap kali Anda ingin menyebutnya.
...

tmow
sumber
Bad $ PATH adalah penyebab paling umum dari skrip yang bekerja dengan tangan, tetapi bukan dari cron.
Patrick
@ Patrick Tentu saja itu masalah jika cron tidak tahu di mana php, jika tidak crontab Elzo akan bekerja tanpa masalah, itu HARUS menjadi masalah PATH.
tmow
Terima kasih banyak atas jawaban Anda. Ini bekerja untuk saya dengan sangat mudah !!! .. Terima kasih banyak @ tmow.
Vignesh Prajapati
5

Ada empat penyebab umum untuk perintah yang bekerja saat mengetik di terminal tetapi tidak dari cron, dalam urutan kesamaan:

  1. Cron menyediakan lingkungan terbatas, mis. Minimal $PATH, dan variabel-variabel lain yang diharapkan hilang.
  2. Cron memanggil / bin / sh secara default, sedangkan Anda mungkin menggunakan beberapa shell lain secara interaktif.
  3. Cron memperlakukan% karakter secara khusus (ini diubah menjadi baris baru dalam perintah).
  4. Cron tidak menyediakan lingkungan terminal atau grafis.

Jika pekerjaan Anda menghasilkan output apa pun, termasuk pesan kesalahan, cron mengirimi Anda email dengan seluruh output. Pastikan Anda membaca surat yang Anda terima secara lokal atau meneruskannya ke alamat yang Anda baca. Untuk meneruskan email dari akun lokal ke beberapa alamat lain, masukkan alamat lainnya ~/.forward. Jika tugas cron dijalankan sebagai pengguna sistem ( root,, webmaster...), pastikan bahwa surat pengguna dialihkan ke Anda (dan admin lainnya); dengan sebagian besar pengaturan email, masukkan baris seperti root: elzodi /etc/aliases.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Daemon cron biasanya mengeksekusi perintah Anda di shell di mana variabel lingkungan PATH dibatasi untuk beberapa sistem default, misalnya / usr / bin: / bin.

Mungkin, phpperintah Anda tidak tersedia di / usr / bin atau / bin dan karenanya skrip gagal saat dijalankan melalui cron dan berjalan sukses saat tidak.

Cron biasanya melaporkan kesalahan atau pesan pekerjaan melalui email ke pengguna root (yaitu ketika perintah mengembalikan status keluar! = 0 atau menghasilkan output ke stdout / stderr) setelah pekerjaan selesai.

Tergantung pada sistem Anda, Anda harus mengatur pengiriman surat lokal untuk mendapatkan pesan-pesan ini.

maxschlepzig
sumber