Saya mencoba membuat cron memanggil dengan PATH yang benar. Ketika saya menjalankan skrip Python dari shell, skrip tersebut berjalan dengan baik karena menggunakan PATH yang ditetapkan di bashrc tetapi ketika saya menggunakan cron semua PATH tidak digunakan dari bashrc. Apakah ada file yang bisa saya masukkan ke PATH untuk cron seperti bashrc atau cara untuk memanggil PATH dari bashrc?
Maaf saya tidak berpikir saya mengucapkan ini dengan benar, saya bisa mendapatkan skrip yang benar untuk dijalankan (artinya PATH ke skrip di crontab bukan masalah di sini), hanya ketika skrip itu berjalan saya menjalankan build dan ini menggunakan PATH diatur .bashrc
. Ketika saya menjalankan skrip saat saya masuk, .bashrc
PATH ditarik masuk. Karena cron tidak berjalan di shell per mengatakan itu tidak menarik .bashrc
. Apakah ada cara untuk menarik ini tanpa harus menulis pembungkus skrip bash?
source /etc/profile
, ia harus makan.bashrc
dan banyak hal lain yang berpotensi hilang untuk Anda. Sumber profil eksplisit menjadi sangat berguna jika Anda ingin beberapa skrip berjalan "mandiri", itu juga melindungi dari lingkungan yang aneh dan sebagainya ...sh
skrip yang dipanggil oleh crontab berfungsi. Anda dapat mengonfirmasikannya memperbarui jalur dengan menambahkan pekerjaan seperti* * * * * echo $PATH > ~/crontab_path.txt
dan memeriksa file setelah satu menit.Jawaban:
Saya dulu
/etc/crontab
. Saya menggunakanvi
dan memasukkan PATH yang saya butuhkan ke dalam file ini dan menjalankannya sebagai root. Crontab normal menimpa PATH yang telah Anda siapkan. Tutorial yang bagus tentang cara melakukan ini .File cron di seluruh sistem terlihat seperti ini:
sumber
/etc/crontab
tersedia untuk cron saat dijalankan sebagai root di Ubuntu 14.04. (sudo crontab -e
)Kemungkinan besar, cron berjalan di lingkungan yang sangat jarang. Periksa variabel lingkungan yang digunakan cron dengan menambahkan pekerjaan tiruan yang akan dibuang
env
ke file seperti ini:Bandingkan dengan keluaran
env
sesi shell normal.Anda dapat menambahkan variabel lingkungan Anda sendiri ke crontab lokal dengan menentukannya di bagian atas crontab Anda.
Berikut perbaikan cepat untuk menambahkan
$PATH
crontab saat ini:Crontab yang dihasilkan akan terlihat mirip dengan jawaban chrissygormley, dengan PATH yang ditentukan sebelum aturan crontab.
sumber
Anda harus meletakkan jalur lengkap di file
crontab
. Itu pilihan teraman.Jika Anda tidak ingin melakukan itu, Anda dapat meletakkan skrip pembungkus di sekitar program Anda, dan mengatur PATH di sana.
misalnya
menjadi:
Juga apa pun yang dipanggil dari
cron
harus sangat berhati-hati tentang program yang dijalankannya, dan mungkin mengatur pilihannya sendiri untukPATH
variabel.EDIT:
Jika Anda tidak tahu di mana perintah yang ingin Anda jalankan
which <command>
dari shell Anda dan itu akan memberi tahu Anda jalannya.EDIT2:
Jadi, setelah program Anda berjalan, hal pertama yang harus dilakukan adalah mengatur
PATH
dan variabel lain yang diperlukan (misalnyaLD_LIBRARY_PATH
) ke nilai yang diperlukan untuk menjalankan skrip.Pada dasarnya, alih-alih memikirkan cara memodifikasi lingkungan cron agar lebih sesuai untuk program / skrip Anda - buat skrip Anda menangani lingkungan yang diberikan, dengan menyetel yang sesuai saat dimulai.
sumber
crontab
.Mengatur PATH tepat sebelum baris perintah di crontab saya berfungsi untuk saya:
sumber
Menambahkan definisi PATH ke crontab pengguna dengan nilai yang benar akan membantu ... Saya telah mengisi milik saya hanya dengan:
Dan itu cukup untuk membuat semua skrip saya berfungsi ... Sertakan jalur khusus apa pun di sana jika Anda perlu.
sumber
/etc/crontab
. Ini adalah jawaban termudah di tingkat pengguna. Kerja bagus @ Treviño. Beri suara jika Anda setuju.Buat variabel Anda bekerja untuk Anda, ini akan memungkinkan akses t
Tentukan PATH Anda di /etc/profile.d/*.sh
Variabel lingkungan seluruh sistem
File dengan ekstensi .sh di direktori /etc/profile.d dieksekusi setiap kali shell login bash dimasukkan (misalnya saat login dari konsol atau melalui ssh), serta oleh DisplayManager saat sesi desktop dimuat.
Anda dapat misalnya membuat file /etc/profile.d/myenvvars.sh dan mengatur variabel seperti ini:
Jalankan crontab dengan opsi login!
CRONTAB menjalankan skrip atau perintah dengan Variabel Lingkungan
sumber
Masalah
Skrip Anda berfungsi saat Anda menjalankannya dari konsol tetapi gagal di cron.
Sebab
Crontab Anda tidak memiliki variabel jalur yang benar (dan mungkin shell)
Larutan
Tambahkan shell Anda saat ini dan letakkan crontab
Script untuk melakukannya untuk Anda
Sumber
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Output Sampel
sumber
Di AIX cron saya mengambil variabel lingkungannya dari / etc / environment mengabaikan apa yang diatur dalam .profile.
Sunting: Saya juga memeriksa beberapa kotak Linux dari berbagai usia dan ini tampaknya memiliki file ini juga, jadi ini sepertinya bukan khusus AIX.
Saya memeriksa ini menggunakan saran cron joemaller dan memeriksa output sebelum dan sesudah mengedit variabel PATH di / etc / environment.
sumber
Jika Anda tidak ingin melakukan pengeditan yang sama di berbagai tempat, lakukan ini secara kasar:
Itu. space dan kemudian path ke .bashrc dan perintah && adalah keajaiban di sana untuk mengubah lingkungan Anda ke dalam bash shell yang sedang berjalan. Juga, jika Anda benar-benar ingin cangkang menjadi bash, ada baiknya untuk memiliki garis di crontab Anda:
Semoga bisa membantu seseorang!
sumber
Lingkungan default untuk pekerjaan cron sangat jarang dan mungkin sangat berbeda dari lingkungan tempat Anda mengembangkan skrip python. Untuk skrip yang mungkin dijalankan di cron, lingkungan apa pun yang Anda andalkan harus disetel secara eksplisit. Di file cron itu sendiri, sertakan path lengkap ke file executable python dan ke skrip python Anda.
sumber
Saya tahu ini sudah dijawab, tetapi saya pikir ini akan berguna bagi sebagian orang. Saya memiliki masalah serupa yang baru saja saya selesaikan ( ditemukan di sini ) dan berikut adalah sorotan dari langkah-langkah yang saya ambil untuk menjawab pertanyaan ini:
pastikan bahwa Anda memiliki variabel yang Anda butuhkan di PYTHONPATH (ditemukan di sini dan di sini dan untuk info lebih lanjut di sini) di dalam .profile atau .bash_profile untuk shell apa pun yang Anda inginkan untuk menguji skrip Anda untuk memastikannya berfungsi.
edit crontab Anda untuk memasukkan direktori yang diperlukan untuk menjalankan skrip Anda dalam pekerjaan cron (ditemukan di sini dan di sini)
a) pastikan untuk menyertakan direktori root dalam variabel PATH (.) seperti yang dijelaskan di sini (pada dasarnya jika Anda menjalankan executable dengan perintah Anda, ia harus dapat menemukan root atau direktori tempat penyimpanan yang dapat dieksekusi) dan mungkin ini (/ sbin: / bin: / usr / sbin: / usr / bin)
di file crontab Anda, buat cronjob yang akan mengubah direktori ke direktori di mana Anda telah berhasil menjalankan skrip sebelumnya (yaitu Users / user / Documents / foo)
a) Ini akan terlihat seperti berikut:
sumber
@Trevino: jawaban Anda membantu saya memecahkan masalah saya. Namun, bagi seorang pemula, coba berikan pendekatan langkah demi langkah.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- ini memungkinkan Anda memahami apa nilai PATH yang digunakan oleh crontab saat ini. Jalankan crontab dan ambil nilai $ PATH yang digunakan oleh crontab.crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(ini adalah jalur sampel); c) sekarang pekerjaan / skrip terjadwal Anda seperti*/10 * * * * sh runMyJob.sh &
; d) keluarkanecho $PATH
dari crontab karena tidak diperlukan sekarang.sumber
Tetapkan PATH yang diperlukan di cron Anda
Edit: Tekan
i
Simpan dan keluar
:wq
sumber
Solusi paling sederhana yang saya temukan terlihat seperti ini:
Contoh ini dipanggil
su
sebagai pengguna root dan memulai shell dengan lingkungan lengkap pengguna, termasuk $ PATH, disetel seolah-olah mereka sedang login. Cara kerjanya sama pada distro yang berbeda, lebih dapat diandalkan daripada mencari .bashrc (yang tidak berfungsi untuk saya) dan menghindari jalur spesifik hardcode yang dapat menjadi masalah jika Anda memberikan contoh atau alat penyiapan dan tidak tahu distro atau tata letak file apa pada sistem pengguna.Anda juga dapat menentukan nama pengguna setelah
su
jika Anda menginginkan pengguna yang berbeda dari root, tetapi Anda mungkin harus meninggalkan perintahroot
parameter beforesu
karena ini memastikansu
memiliki hak yang cukup untuk beralih ke pengguna mana pun yang Anda tentukan.sumber
Jika Anda menggunakan
webmin
maka ini adalah langkah-langkah cara mengaturPATH
nilainya:sumber