Bagaimana saya bisa menjalankan perintah cron dengan variabel lingkungan yang ada?
Jika saya berada di prompt shell saya bisa mengetik echo $ORACLE_HOME
dan mendapatkan path. Ini adalah salah satu variabel lingkungan saya yang akan ditetapkan di saya ~/.profile
. Namun, sepertinya ~/.profile
skrip fron cron tidak dapat dimuat dan skrip saya gagal karena $ORACLE_HOME
variabel tidak disetel.
Dalam pertanyaan ini penulis menyebutkan membuat ~/.cronfile
profil yang mengatur variabel untuk cron, dan kemudian ia melakukan solusi untuk memuat semua perintah cronnya ke dalam skrip yang disimpannya di ~/Cron
direktori. File seperti ~/.cronfile
terdengar seperti ide yang bagus, tetapi sisa jawabannya tampaknya sedikit rumit dan saya berharap seseorang dapat memberi tahu saya cara yang lebih mudah untuk mendapatkan hasil yang sama.
Saya kira di awal skrip saya, saya bisa menambahkan sesuatu seperti source ~/.profile
tapi itu sepertinya bisa berlebihan.
Jadi bagaimana saya bisa membuat skrip cron saya memuat variabel dari profil shell-interaktif saya?
source ~/.profile
ke dalam suatu program mubazir? Program mewarisi lingkungannya dari program panggilan. Jika program panggilan itu bukan shell Anda, lalu bagaimana program yang akan mendapatkan lingkungan yang Anda inginkan?su -l
untuk mensetup lingkungan login normal termasuk $ PATH untuk root atau pengguna tertentu lainnya.Jawaban:
Di crontab, sebelum Anda memerintahkan, tambahkan
. $HOME/.profile
. Sebagai contoh:Cron
tidak tahu apa-apa tentang cangkang Anda; dimulai oleh sistem, sehingga memiliki lingkungan minimal. Jika Anda menginginkan sesuatu, Anda harus membawa itu ke dalam diri Anda.sumber
.
sebelum skrip? (tidak yakin bagaimana saya melakukannyaman
). Mengapa ini berbedasource
?.
perintah perintah asli untuksource
. Mereka setara dalam shell dan sedikit lebih mudah untuk diketik, terutama di dalam crontab. Untuk mendapatkan info lebih lanjut, ketikhelp .
atau cari^SHELL BUILTIN COMMANDS
di halaman manual untukbash
atau di bagian atas tipeman
zshbuiltins .`. Running
akan memberi tahu Anda bahwa perintahnya adalah builtin..profile
oleh.bash_profile
. Periksa.profile
file mana yang ada di direktori home pengguna.Pilihan lain, yang menurut saya lebih mudah, adalah menjalankan skrip dengan cron dan memiliki lingkungan dalam skrip.
Dalam file crontab -e:
Dalam file cron_job.sh:
Perintah apa pun setelah sumber .bash_profile akan memiliki lingkungan Anda seolah-olah Anda masuk.
sumber
/bin/bash
sebagai shell. Saya terus bertanya-tanya mengapa hal-hal seperticd /path/to/project; source .vars
akan berfungsi ketika saya mengetik secara manual tetapi akan gagal (File not found
) ketika dimasukkan dalam cronjob. Baris kunci bagi saya adalah pengaturanSHELL=/bin/bash
sehingga saya benar-benar bisa menggunakan perintah bash yang sudah dikenal di setiap cronjob./bin/sh/
(cron shell default, tampaknya) sangat terbatas.EnvironmentFile
unit layanan. Sayang sekali cron tidak memiliki yang serupa.$SHELL
adalah/bin/sh
, yangsource
perintah tidak ada. Gunakan.
sebagai gantinya.Opsi lain, yang menurut saya lebih mudah, adalah menjalankan skrip dengan cron dan menyuruh bash untuk masuk (karenanya menggunakan
/etc/profile.d/...
definisi lingkungan)Dalam
crontab -e
file:Perintah apa pun setelah sumber
.bash_profile
akan memiliki lingkungan Anda seolah-olah Anda masuk.sumber
Ide buruk. Praktik umum adalah secara khusus mengatur semua variabel lingkungan yang diperlukan dalam skrip yang akan dijalankan dari pekerjaan cron.
sumber
/usr/bin/env
perintah untuk mengatur variabel dan kemudian dapat bertindak sebagai proses lingkungan untuk cronjob.envdir
muncul dalam pikiran.~/.cronvars
dan memasukkannya ke dalam profil dan juga dalam skrip cron saya. Saya tidak ingin variabel lingkungan kode keras di setiap skrip saya jalankan karena ketika jalur mengubah jalur kode keras di setiap file tidak mudah untuk dipelihara. Sepertinya itu akan memungkinkan tempat tersentralisasi untuk variabel yang diperlukan dan tetap menjaga variabel lainnya dari tidak dimuat.Sintaks ini pasti membantu Anda. Saya tidak mengerti sintaksnya, tetapi itu berhasil. Oracle menggunakan sintaks ini, ketika menyebarkan Oracle Configuration Manager ke crontab, oleh karena itu, saya percaya bahwa ini adalah solusi yang tepat.
sumber
Saya baru-baru ini menemukan sebuah kasus di mana saya harus menjalankan cronjob secara keseluruhan sebagai root tetapi, pada saat yang sama, harus menjalankan sub-perintah sebagai pengguna yang berbeda (yang membutuhkan sumber lingkungan pengguna itu). Saya pergi dengan pendekatan berikut:
Bagian penting adalah argumen
-i
yang diteruskan kesudo
mana akan menjalankan perintah yang diberikan dalam shell login yang terpisah (yang pada gilirannya berarti bahwa dotfile pengguna akan bersumber).PS: Perhatikan bahwa
user
kolom hanya tersedia di dalam/etc/crontab
dan/etc/cron.d/*
file.sumber
Solusinya, yang bekerja untuk saya, dijelaskan di sini .
Anda membuat skrip pembungkus, yang memanggil
. ~/.cronfile
, dan kemudian melakukan hal-hal yang Anda inginkan. Script ini diluncurkan oleh cron.Di
~/.cronfile
Anda tentukan lingkungan untuk pekerjaan cron Anda.sumber
Ya, Anda dapat menggunakan "solusi terkenal" (beberapa di antaranya telah terdaftar). Ini adalah cara lain untuk mengatakan bahwa semua orang tahu itu jelek, meskipun beberapa orang akan menyebut ini sebagai "fitur keamanan" karena mereka telah menghabiskan setidaknya sebanyak tersandung kegagalan ini (ure) seperti yang Anda miliki, dan ingin berpikir mereka buang waktu bukan untuk sia-sia. Ini setara dengan cron dari keyboard QWERTY.
Saya menduga alasan aslinya mungkin karena kinerja, sehingga skrip berjalan sekali dalam satu menit tidak akan menghabiskan waktu untuk membaca skrip rc. Awalnya cron juga tidak benar-benar dapat dikonfigurasi, jadi default adalah satu-satunya pilihan.
Tidak ada keamanan tambahan dengan tidak memiliki beberapa konfigurasi atau metode sederhana untuk memiliki cron hanya mengambil lingkungan shell interaktif Anda alih-alih pengguna harus melakukan senam shell bodoh. Pada mesin modern umumnya tidak ada perolehan kinerja yang jelas kecuali Anda memiliki banyak pekerjaan yang berjalan setiap menit.
Budaya Unix gagal. Menurut pendapat saya. :-)
sumber
Menambahkan
ke crontab. Lihat Cara menjamin ketersediaan $ BASH_ENV
sumber
Alih-alih mengatur profil, yang membantu saya adalah mengatur
PATH
. Beberapa perintah tidak tersedia di skrip cron saya karenaPATH
berbeda.Pengaturan
PATH
dengan jalur perintah membantu saya. Lebih baik lagi jika Anda dapat menggunakan templat dan melakukan detemplatize nanti,Melewati variabel ke setiap item terlihat berantakan.
sumber
Saya menempatkan.
~/.dbus/session-bus/*
di bagian atas skrip yang saya inginkan :)sumber