Saya memiliki skrip cadangan yang harus saya jalankan pada waktu tertentu dalam sehari, jadi saya gunakan cron
untuk tugas ini dan dari dalam cron saya juga mencoba untuk mengarahkan output skrip cadangan ke a logfile
.
crontab -e
*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log
Dalam entri cron di atas saya mengarahkan keduanya stderr and stdout
ke file log.
Pekerjaan cron di atas mengeksekusi dengan baik menurut syslog
dan melakukan tugas yang disebutkan dalam backup.sh
file tetapi tidak menulis apa pun ke file log.
/var/log/syslog
Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)
Ketika saya menjalankan skrip dari cli ia berfungsi seperti yang diperlukan dan output ditulis ke file log
ranveer@ranveer:~$ ./backup.sh &>> backup.log
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$
Jadi, mengapa output file tidak diarahkan ke file dari dalam cron.
bash
io-redirection
cron
RanRag
sumber
sumber
Jawaban:
Saya memecahkan masalah. Ada dua cara:
M1
Ubah pengalihan dari
&>>
menjadi2>&1
. Jadi sekarangcrontab -e
sepertinyaSaya percaya di atas berfungsi karena secara default
cron
digunakansh
untuk menjalankan tugas, bukanbash
jadi&>>
tidak didukung olehsh
.M2
Mengubah shell default dengan menambahkan
SHELL=/bin/bash
dalamcrontab -e
berkas.sumber
cron
sepertish
: tidak memilih satu program. Ada banyak implementasi. Implementasi yang paling umum adalah Vixie cron. Saya adalah penulis (saat ini, bukan yang asli) dari penulis lain. Saya percaya bahwa sebagian besar daemon cron akan menggunakan sistemsh
, tetapi itu dapat bervariasi apakah ia menerimanya&>>
. Beberapa daemon cron (seperti milik saya) tidak memungkinkan Anda untuk mengubah cangkang mana yang mengeksekusi garis cron denganSHELL=...
garis di crontab. Saya senang Anda menemukan solusi yang cocok untuk Anda; hanya berpikir itu layak menunjukkan ada banyak variabel yang dapat mempengaruhi apakah itu berfungsi untuk orang lain.YYYY-MM-DD_hh-mm-sec
ke dalam nama file output, sehingga setiap nama file berbeda dan disimpan tanpa menulis ulang?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
melakukan hal yang sama juga.penafian [1].
Saya ingin menambahkan catatan kaki atau addendum ke jawaban @ RanRag .
Pastikan sintaks redirection shell Anda sesuai
/bin/sh
. Jika Anda mencoba menggunakan sintaks redirection shell yang tidak valid dengan/bin/sh
maka perintah Anda akan gagal dan pekerjaan cron Anda tidak akan pernah berjalan.Dalam
/etc/cron.d/example1
file konfigurasi Anda jika Anda menentukan pengguna selainroot
dan bahwa shell login pengguna tidak/bin/bash
... Anda masih harus menggunakan sintaks / bin / sh dalam/etc/cron.d/example1
perintah.Sebagai contoh
Jika pengguna Anda memiliki shell
csh
atauzsh
atauksh
ditetapkan untuk shell login-nya. Dalam/etc/cron.d/example1
file konfigurasi Anda , perintah harus menggunakan/bin/sh
sintaks. Khususnya pengalihan shell harus/bin/sh
sintaks.Jika Anda mencoba menggunakan misalnya
csh
shell redirect syntax di Anda/etc/cron.d/example1
, maka tugas cron Anda tidak akan pernah berjalan. Logfile untukcrond
terletak di/var/log/cron
harus mengatakan bahwa perintah dijalankan tetapi perintah akan kesalahan dengan kesalahan sintaks sebelum perintah Anda dijalankan.Di mana
crond
memancarkan pesan kesalahan untuk kesalahan sintaks?Kesalahan tidak pernah dilaporkan dalam
/var/log/cron
.crond
sebagai gantinya memancarkan pesan kesalahan menggunakanmail
. Jadi, Anda harus memeriksa/var/spool/mail/${USER}
untuk melihat apa kesalahannya.[1]
Penolakan
sysv
sistemsystemd
informasi mungkin berbedacentos-6
distro dan mungkin tidak berlaku untuksysv
distro yang berbedacentos-6
secara khusus, karena distro yang berbeda mungkin memilikicrond
implementasi yang berbeda dari yang berbedacentos-6
sumber
/etc/cron.d/example1
perintah Anda menggunakan shell yang berbeda, Anda dapat menggunakan setSHELL=
di/etc/cron.d/example1
file konfigurasi Anda .