Bagaimana cara mengarahkan output ke file dari dalam cron?

105

Saya memiliki skrip cadangan yang harus saya jalankan pada waktu tertentu dalam sehari, jadi saya gunakan cronuntuk 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 stdoutke file log.

Pekerjaan cron di atas mengeksekusi dengan baik menurut syslog dan melakukan tugas yang disebutkan dalam backup.shfile 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.

RanRag
sumber
superuser.com/questions/122246/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

158

Saya memecahkan masalah. Ada dua cara:

M1

Ubah pengalihan dari &>>menjadi 2>&1. Jadi sekarang crontab -esepertinya

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Saya percaya di atas berfungsi karena secara default crondigunakan shuntuk menjalankan tugas, bukan bashjadi &>>tidak didukung oleh sh.

M2

Mengubah shell default dengan menambahkan SHELL=/bin/bashdalam crontab -eberkas.

RanRag
sumber
14
cronseperti sh: 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 sistem sh, tetapi itu dapat bervariasi apakah ia menerimanya &>>. Beberapa daemon cron (seperti milik saya) tidak memungkinkan Anda untuk mengubah cangkang mana yang mengeksekusi garis cron dengan SHELL=...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.
dubiousjim
Bagaimana cara memasukkan YYYY-MM-DD_hh-mm-secke dalam nama file output, sehingga setiap nama file berbeda dan disimpan tanpa menulis ulang?
Danijel
1
@Danijel: Ini akan membantu serverfault.com/questions/117360/…
RanRag
2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logmelakukan hal yang sama juga.
Yanick Girouard
5

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/shmaka perintah Anda akan gagal dan pekerjaan cron Anda tidak akan pernah berjalan.

Dalam /etc/cron.d/example1file konfigurasi Anda jika Anda menentukan pengguna selain rootdan bahwa shell login pengguna tidak /bin/bash... Anda masih harus menggunakan sintaks / bin / sh dalam /etc/cron.d/example1perintah.


Sebagai contoh

Jika pengguna Anda memiliki shell cshatau zshatau kshditetapkan untuk shell login-nya. Dalam /etc/cron.d/example1file konfigurasi Anda , perintah harus menggunakan /bin/shsintaks. Khususnya pengalihan shell harus /bin/shsintaks.

Jika Anda mencoba menggunakan misalnya cshshell redirect syntax di Anda /etc/cron.d/example1, maka tugas cron Anda tidak akan pernah berjalan. Logfile untuk crondterletak di /var/log/cronharus mengatakan bahwa perintah dijalankan tetapi perintah akan kesalahan dengan kesalahan sintaks sebelum perintah Anda dijalankan.

Di mana crondmemancarkan pesan kesalahan untuk kesalahan sintaks?

Kesalahan tidak pernah dilaporkan dalam /var/log/cron. crondsebagai gantinya memancarkan pesan kesalahan menggunakan mail. Jadi, Anda harus memeriksa /var/spool/mail/${USER}untuk melihat apa kesalahannya.

[1]

Penolakan

  • Jawaban ini mengasumsikan suatu sysvsistem
  • systemd informasi mungkin berbeda
  • Secara khusus informasi ini dipelajari untuk centos-6distro dan mungkin tidak berlaku untuk sysvdistro yang berbeda
    • Saya sebutkan centos-6secara khusus, karena distro yang berbeda mungkin memiliki crondimplementasi yang berbeda dari yang berbedacentos-6
Trevor Boyd Smith
sumber
2
jika Anda ingin /etc/cron.d/example1perintah Anda menggunakan shell yang berbeda, Anda dapat menggunakan set SHELL=di /etc/cron.d/example1file konfigurasi Anda .
Trevor Boyd Smith