Saya memiliki skrip yang berfungsi saat saya menjalankannya dari baris perintah, tetapi ketika saya menjadwalkannya dengan cron
saya mendapatkan kesalahan sehingga tidak dapat menemukan file atau perintah. Pertanyaan saya ada dua:
Ketika saya menjadwalkan penggunaan tugas cron
crontab -e
, apakah ia menggunakan ID pengguna saya sebagai dasar untuk izinnya? Atau apakah ia menggunakan ID pengguna cron dari beberapa jenis dan izin yang terkait?Ketika pekerjaan cron diluncurkan, apa itu direktori kerja? Apakah ini direktori tempat saya menentukan skrip untuk dijalankan, atau direktori lain?
Inilah pekerjaan cron saya:
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
Berikut ini skrip yang sebenarnya:
vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt
Berikut adalah kesalahan yang saya dapatkan ketika saya melihat mail
pesan yang dihasilkan oleh cron
:
sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found
Itu tidak dapat menemukan template.txt
tetapi itu berada di direktori yang sama dengan skrip. Itu juga tidak bisa berjalan ssmtp
, tetapi saya bisa sebagai pengguna saya. Apa yang saya lewatkan agar ini berfungsi dengan baik?
sumber
cron
itu miliknya sendiriPATH
atau dapatkah saya memeriksa pengguna sayaPATH
? Saya mengatur ssmtp untuk memilikinya sendiriuser
danwheel
izin berpikir itu akan memungkinkan siapa saja untuk menggunakannya (termasuk cron). Jika ini membantu saya di CENTOS 6.2ssmtp
, tetapi bahwa pekerjaan cron Anda tidak menemukan executable yang dipanggilssmtp
karena tidak ada dalam AndaPATH
. Tidak ada yang namanya "pengguna AndaPATH
"; ini adalah pengaturan per proses, bukan pengaturan per pengguna. Anda dapat mengatur jalur untuk semua pekerjaan cron Anda dengan meletakkanPATH=…
garis di crontab Anda.´which ssmtp´ ...
type ssmtp
Jika cronjob Anda adalah skrip bash, yang berikut ini akan CD ke lokasi skrip Anda (dengan asumsi bahwa Anda menggunakan path absolut dalam definisi cron Anda):
sumber
Untuk menjawab pertanyaan 1: jika Anda menjalankan
crontab -e
sebagai pengguna Anda sendiri, pekerjaan akan dijadwalkan di crontab pengguna tersebut dan karenanya akan dijalankan dengan izin dari pengguna tersebut.Tetapi Anda perlu mempertimbangkan bahwa pekerjaan akan berjalan dalam shell non-interaktif yang berarti bahwa $ PATH mungkin berbeda dari yang Anda miliki saat menjalankan skrip dari baris perintah.
Yang terbaik adalah selalu menggunakan path lengkap dalam skrip, terutama jika Anda berencana untuk menjadwalkannya melalui di / cron dll.
Saya juga merekomendasikan menggunakan path lengkap ke semua file untuk menghindari masalah yang Anda lihat.
Untuk mencegah kondisi ras dan masalah keamanan lainnya, Anda juga harus menggunakan
mktemp
untuk memastikan file yang Anda baca tidak diubah oleh apa pun di luar skrip Anda.Jadi saya akan mengubah skrip ke sesuatu seperti:
sumber
cron
menjalankan pekerjaan terjadwal masing-masing pengguna sebagai pengguna itu. Ini seharusnya cukup bagi kami untuk mengetahui bahwa skrip Anda dijalankan relatif terhadap direktori home Anda.Jika Anda perlu menjalankannya dari lokasi yang berbeda, cukup gunakan
cd
di skrip Anda untuk pergi ke lokasi itu.ssmtp
mungkin tidak dalamcron
PATH default (ini diatur menjadi sangat sempit dengan desain pada sebagian besar platform). Anda dapat menentukan path lengkap kessmtp
dalam skrip Anda, atau Anda dapat secara eksplisit mengatur PATH di a) file crontab Anda, yang akan tersedia untuk semua skrip Anda, atau b) di setiap skrip.sumber
Periksa utas ini bagaimana Anda dapat dengan mudah mengetahui lingkungan cron, ini jauh lebih sedikit daripada yang biasa Anda gunakan dalam shell interaktif. Yang terbaik adalah mengasumsikan tidak ada yang ditetapkan dan secara eksplisit mengaturnya sendiri.
sumber
Direktori kerja default untuk
cron
menjalankan pekerjaan adalah direktori home, biasanya/home/your-user-name
.Mengadopsi @Kusalananda komentar luar biasa.
sumber
/home
jauh dari universal./home
./Users
dan riwayat penggunaan Sejarah/usr
, dan bahkan di Linux, direktori home pengguna sistem mungkin berada di suatu tempat di bawah/var
atau di tempat lain.Beberapa orang telah mengisyaratkan atau menautkannya tetapi cara terbaik untuk mengetahuinya karena saya tidak dapat menemukannya di man docs untuk distro saya hanya menambahkan ini ke cron
Dalam kasus saya, default Ubuntu hanya menggunakan
/usr/bin:/bin
yang menyebabkan beberapa masalah.sumber