Saya telah mendefinisikan variabel "SHELL" di file / etc / crontab:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
Selain itu, semua skrip saya di file / etc / crontab dimulai di bawah "martin" pengguna. Namun /home/martin/.bash_profile (untuk shell login) dan /home/martin/.bashrc (untuk shell non-logging) berisi beberapa variabel yang diabaikan dalam hal pekerjaan cron, tetapi digunakan jika saya login ke mesin lebih SSH atau buka sesi bash baru. Mengapa cron mengabaikan variabel-variabel itu? Bukankah cron hanya menjalankan "/ usr / local / bin / bash my-script.sh" dengan izin untuk pengguna "martin"?
.bashrc
memiliki garis yang menghentikannya berjalan di shell non-interaktif.Jawaban:
Anda dapat sumber file yang Anda inginkan di bagian atas skrip atau awal pekerjaan untuk pengguna yang menjalankan pekerjaan. Perintah "sumber" adalah built-in. Anda akan melakukan hal yang sama jika Anda mengedit file-file itu untuk memuat perubahan.
atau
sumber
bash
shell. Saya telah menambahkan jawaban yang dapat menangani kasus ini ketika shellnyash
.Karena itu bukan shell interaktif. Hal yang sama terjadi ketika Anda membuka beberapa terminal.
Lihat pertanyaan ini: Apa itu file .bashrc? | Pengguna Super
Dan juga yang ini:
Apa perbedaan antara .bashrc, .bash_profile, dan .environment? | Stack Overflow
Skrip yang berbeda menyala tergantung pada apakah koneksi adalah shell login (atau tidak), shell interaktif (atau tidak), atau keduanya.
Jika Anda ingin membuat bashrc Anda harus melakukan perubahan ini:
Sumber: Bash Startup Files | Manual Referensi Bash | gnu.org
sumber
Anda mungkin tidak dapat menjalankan
source
jikash
shell sedang digunakan. Ini dapat diubah dengan menambahkan baris berikut di crontab Anda:Anda juga dapat menentukan lingkungan:
atau Anda dapat menggunakan lokal Anda
/home/user/.bashrc
jika itu adalah pekerjaan cron pengguna (misalnyacrontab -e
).Catatan yang
.bash_profile
bisa diganti.bashrc
, jika ada.Kredit: Bagaimana cara mengganti cron shell (sh to bash)?
sumber
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Hal lain yang dapat mengganggu sumber Anda
.bashrc
dari cronjob adalah pemeriksaan apa pun yang dilakukan file ini untuk mendeteksi kerang interaktif.Misalnya, pada Ubuntu 18.04, default
.bashrc
untuk pengguna dimulai dengan ini:dan sumber itu tidak akan melakukan apa pun yang berguna karena akan segera keluar.
sumber
Anda dapat meminta bash dengan
-l
opsi, seperti ini:The
-l
pilihan membuat bash masuk shell. Jadi, itu akan membaca pengguna.bash_profile
. Itu tidak akan membaca pengguna.bashrc
kecuali secara eksplisit bersumber dari.bash_profile
. Ini karena kerang non-interaktif tidak otomatis dibaca.bashrc
. Tetapi Anda tidak perlu.bashrc
untuk pekerjaan cron karena.bashrc
untuk mengatur hal-hal yang berguna untuk shell interaktif .Variasi:
Jika bash ada di PATH, tidak perlu menentukan jalur absolut:
Pengoptimalan akan menggantikan shell saat ini dengan menggunakan
exec
:sumber
bash
bertindak berbeda apakah itu shell atau bahasa pemrograman normal (sukaperl
ataupython
).Secara desain, pengaturan dalam
~/.bash_profile
,,~/.bashrc
dll. Adalah bagi pengguna untuk mengatur hal-hal ketikabash
memainkan peran shell (shell login, shell interractive). Pikirkan tentang lingkungan yang Anda miliki dixterm
(shell interaktif) atau dissh
sesi (shell login) atau di konsol (shell login).Di sisi lain,
bash
juga merupakan bahasa pemrograman yang kuat - pikirkan banyak skrip untuk mengelola layanan disystemd
- yang membutuhkan gaya kerja yang berbeda. Misalnya, ketika pengembang menulis skrip sistem ataubash
program, ia tidak akan suka untuk sumber pengguna~/.bash_profile
secara otomatis. Ini adalah program normal, bukan shell. Program normal (termasukbash
program) secara alami akan mewarisi pengaturan dari lingkungan kerja saat ini (shell), tetapi tidak mengaturnya .Jika kita menulis sebuah program untuk
cron
inbash
– itu kebetulan ditulis dalambash
; pada kenyataannya, kita dapat menulis dalampython
atauperl
atau progamming lainnya pada bahasa maka kita dapat memiliki pilihan untuk sumberbash
's~/.bash_profile
(baca: pengaturan dari shell pengguna, yang kebetulan menjadi bahasa yang sama bahasa pemrograman Anda):Namun, bagaimana jika pengguna tertentu itu tidak menggunakan
bash
shellnya? Dia / dia dapat menggunakanzsh
,ksh
,fish
, dll Jadi, praktek yang akan benar-benar bekerja ketika menulis program untuk kepentingan umum.Jadi, Anda dapat sumber
~/.bash_profile
jika Anda pikir itu akan berhasil. Tapi, di sini, ini bukan tentang apakah kita dapat sumber file, ini tentang bagaimana hal-hal seharusnya bekerja dalam sistem: konsep desain . Singkatnya: kita harus melihatbash
sesuatu yang memiliki 2 peran: bahasa shell dan progamming . Maka semuanya akan jauh lebih mudah dipahami.sumber
Saya memiliki masalah yang sama ketika menjalankan aplikasi node dari cron yang menggunakan NVM, Untuk membuat bash shell untuk membaca file .bashrc dari cron hanya memerlukan perintah bash dengan opsi shell interaktif `-l.
misalnya:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Jika itu tidak berhasil, coba setel variabel path di crontab
sumber
Cara saya menghadapinya adalah ini:
1) Meletakkan variabel saya di (akhir)
~/.profile
:2) Membuat skrip Bash untuk tugas cron (harian)
~/cronDaily.sh
saya ( ) yang berisi perintah saya ditambah sumber berulang~/.profle
:3) menjadwalkan eksekusi skrip saya dari
crontab
, untuk berjalan setiap hari:Variabel saya tidak diabaikan dan perintah berjalan dengan sukses.
Beberapa orang mungkin mengatakan bahwa sumber intens seperti
~/.profile
itu bermasalah. Dalam kasus khusus saya, saya tidak melihat mengapa ini merupakan masalah tetapi saya akan menyarankan untuk mempertimbangkan membuat file khusus untuk itu.Secara umum, mungkin ada cara yang lebih baik untuk ini, tetapi itulah yang berhasil bagi saya setelah banyak kesakitan dan itu menjelaskan prinsip bahwa pada Bash 4.3.46, Anda tidak dapat sumber file dari
crontab
.sumber