Mintalah 'cron' menjalankan skrip shell yang mengatur lingkungan sebelum menjalankan perintah.
Selalu.
# @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
# Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min Hour Day Month Weekday Command
#-----------------------------------------------------------------------------
0 * * * * /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1 1 * * * /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2 3 * * 0 /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21 3 1 * * /usr/bin/ksh /work1/jleffler/bin/Cron/monthly
Skrip di ~ / bin / Cron adalah semua tautan ke satu skrip, 'runcron', yang terlihat seperti:
: "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
# Commands to be performed by Cron (no debugging options)
# Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile
base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base
if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi
exec $cmd ${@:+"$@"}
(Ditulis menggunakan standar pengkodean yang lebih lama - saat ini, saya akan menggunakan shebang '#!' Di awal.)
'~ / .Cronfile' adalah variasi pada profil saya untuk digunakan oleh cron - sangat non-interaktif dan tidak ada gaung demi menjadi berisik. Anda dapat mengatur untuk mengeksekusi. Profil dan sebagainya sebagai gantinya. (Barang-barang REAL_HOME adalah artefak dari lingkungan saya - Anda dapat berpura-pura sama dengan $ HOME.)
Jadi, kode ini membaca lingkungan yang sesuai dan kemudian menjalankan versi non-Cron dari perintah dari direktori home saya. Jadi, misalnya, perintah 'hari kerja' saya terlihat seperti:
: "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
# Commands to be done each weekday
# Update ICSCOPE
n.updics
Perintah 'harian' lebih sederhana:
: "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
# Commands to be done daily
# Nothing -- most things are done on weekdays only
exit 0
Saya punya satu solusi lagi untuk masalah ini:
Dalam hal ini ia akan memilih semua variabel lingkungan yang ditentukan dalam
$HOME/.profile
file Anda .Tentu saja
$HOME
juga tidak diatur, Anda harus menggantinya dengan path lengkap Anda$HOME
.sumber
source ~/.bashrc
, dan ternyata.bashrc
file saya agak bertentangan dengan pekerjaan cron. Jika saya menggunakan.env_setup_rc
file yang sangat sederhana dengan hanya satu barisexport MY_ENV_VAR=my_env_val
:, sebenarnya berfungsi. Lihat posting saya: stackoverflow.com/questions/15557777/…Mengatur vars in
/etc/environment
juga bekerja untuk saya di Ubuntu. Pada 12,04, variabel dalam/etc/environment
dimuat untuk cron.sumber
env >> /etc/environment
dan semua env vars saat ini sekarang tersedia di pekerjaan CRON.env >> /etc/environment
akan GAGAL jika ada tanda pagar di salah satu variabel lingkungan. Saya mengalami kesulitan saat memecahkan masalah aplikasi saya. Ternyata itu adalah kata sandi yang berisi '#' yang terpotong pada langkah itu.Jika Anda memulai skrip yang Anda jalankan melalui cron dengan:
Mereka harus mengambil
~/.bash_profile
variabel lingkungan Andasumber
root
crontab? Tidak ada/home/root
folder di sistem saya dan jadi saya tidak melihat bagaimana ini akan bekerja denganroot
crontab. Ide ide?#!/bin/bash
. Keajaiban di sini adalah untuk menambahkan-l
Memperluas contoh @carestad, 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
Bagi saya, saya harus mengatur variabel lingkungan untuk aplikasi php. Saya membuatnya kembali dengan menambahkan kode berikut ke crontab saya.
crontab:
dan di dalam doSomethingWonderful.php saya bisa mendapatkan nilai lingkungan dengan:
Saya harap ini membantu!
sumber
Apa pun yang Anda atur
crontab
akan tersedia di cronjobs, baik secara langsung dan menggunakan variabel dalam skrip.Gunakan mereka dalam definisi cronjob
Anda dapat mengkonfigurasi
crontab
sehingga menetapkan variabel yang kemudian dapat digunakan cronjob:Sekarang file tersebut
/tmp/hello
menunjukkan hal-hal seperti:Gunakan mereka dalam skrip yang dijalankan oleh cronjob
Anda dapat mengonfigurasi
crontab
sehingga menetapkan variabel yang kemudian dapat digunakan skrip:Dan katakan skripnya
/tmp/myscript.sh
seperti ini:Ini menghasilkan file yang
/tmp/myoutput.res
menunjukkan:sumber
Memperluas pada @Robert Brisita baru saja berkembang, juga jika Anda tidak ingin mengatur semua variabel profil dalam skrip, Anda dapat memilih variabel untuk diekspor di bagian atas skrip
Dalam file crontab -e:
Di script.sh
sumber
Dari pada
Gunakan bash -l -c
sumber
-l
seperti ini#!/bin/bash -l
:? Jawaban lain ini sederhana dan elegan.Saya menggunakan
Oh-my-zsh
di macbook saya, jadi saya sudah mencoba banyak hal untuk menjalankan tugas crontab, tetapi akhirnya, solusi saya adalah mendahulukan.zshrc
sebelum perintah dijalankan.Tugas ini berjalan setiap 30 menit dan menggunakan
.zshrc
profil untuk menjalankan perintah simpul saya.Jangan lupa untuk menggunakan titik sebelum
$HOME
var.sumber
Cara lain - terinspirasi oleh jawaban ini - untuk "menyuntikkan" variabel adalah sebagai berikut (contoh fcron):
Dari
help set
:Jadi segala sesuatu di antaranya
set -
danset +
diekspor keenv
dan kemudian tersedia untuk skrip lain, dll. Tanpa menggunakanset
variabel bersumber tetapi tinggalset
hanya di .Selain itu, sangat berguna untuk meneruskan variabel ketika suatu program membutuhkan akun non-root untuk dijalankan tetapi Anda memerlukan beberapa variabel di dalam lingkungan pengguna lain itu. Di bawah ini adalah contoh yang lewat di nullmailer vars untuk memformat header email:
sumber
Saya mencoba sebagian besar solusi yang disediakan, tetapi tidak ada yang berhasil pada awalnya. Tapi ternyata bukan solusi yang gagal. Rupanya,
~/.bashrc
file saya dimulai dengan blok kode berikut:Ini pada dasarnya adalah
case statement
yang memeriksa set opsi saat ini di shell saat ini untuk menentukan bahwa shell sedang berjalan secara interaktif. Jika shell dijalankan secara interaktif, maka shell akan beralih ke sumber~/.bashrc
file. Namun, dalam shell yang dipanggil olehcron
,$-
variabel tidak mengandungi
nilai yang menunjukkan interaktivitas. Oleh karena itu,~/.bashrc
file tidak pernah didapatkan sepenuhnya. Akibatnya, variabel lingkungan tidak pernah ditetapkan. Jika ini adalah masalah Anda, jangan ragu untuk mengomentari blok kode sebagai berikut dan coba lagi:Saya harap ini ternyata bermanfaat
sumber
Anda juga dapat menambahkan perintah Anda dengan
env
menyuntikkan variabel Lingkungan seperti:sumber