Çıktıyı cron içinden bir dosyaya nasıl yönlendiririm?


105

Günün belirli bir saatinde çalıştırmam gereken bir yedekleme betiğim var, bu yüzden cronbu görev için kullanıyorum ve cron içinden de yedekleme betiği çıktısını a'ya yönlendirmeye çalışıyorum logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

Yukarıdaki cron girişinde her ikisini stderr and stdoutde bir günlük dosyasına yönlendiriyorum .

Yukarıdaki cron işi syslog , backup.shdosyaya göre belirtilen görevi yerine getirir ve günlük dosyasına hiçbir şey yazmaz.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Komut dosyasını cli'den çalıştırdığımda gerektiği gibi çalışıyor ve çıktı bir günlük dosyasına yazılıyor

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:~$ 

Peki, neden dosya çıktısı cron içinden dosyaya yönlendirilmiyor.


Yanıtlar:


158

Sorunu çözdüm. İki yol var:

M1

Yönlendirmeyi - olarak &>>değiştirin 2>&1. Şimdi crontab -ebenziyor

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

İnanıyorum çünkü varsayılan olarak yukarıdaki eserler cronkullanıyor shyerine görevi çalıştırmak için bashöylesine &>>tarafından desteklenmemektedir sh.

M2

Ekleyerek varsayılan kabuk değiştirme SHELL=/bin/bashiçinde crontab -edosyanın.


14
crongibidir sh: tek bir program seçmez. Birçok uygulama var. En yaygın uygulama Vixie cron'dur. Ben bir başkasının (şimdiki orijinali değil) yazarıyım. Çoğu cron daemonunun sistemin kullanacağına inanıyorum sh, ancak kabul edip etmemesine göre değişebilir &>>. Bazı cron daemonları (benimki gibi) SHELL=...crontab'larda crontab'larda çizgilerle hangi kabuğun çalıştığını değiştirmenize izin vermez . Sizin için işe yarayan bir çözüm bulduğuma sevindim; sadece, bunun başkaları için işe yarayıp yaramadığını etkileyebilecek birçok değişken olduğunu belirtmeye değdiğini düşündüm.
dubiousjim

YYYY-MM-DD_hh-mm-secÇıktı dosya adına nasıl girilir , böylece her dosya adı farklıdır ve yeniden yazılmadan tutulur?
Danijel


2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logaynı şeyi de yapar.
Yanick Girouard

5

feragatname [1].

@ RanRag'ın cevabına dipnot veya ek eklemek istiyorum .

Kabuk yönlendirme sözdiziminizin uyduğundan emin olun /bin/sh. Geçerli olmayan kabuk yönlendirme sözdizimini kullanmaya çalışırsanız /bin/sh, komutunuz başarısız olur ve cron işiniz çalışmaz.

Senin içinde /etc/cron.d/example1yapılandırma dosyalarından dışında başka bir kullanıcı belirtirseniz rootve bu kullanıcının oturum açma kabuğu değil /bin/bashde ... hala kullanmalıdır / bin / sh sözdizimi /etc/cron.d/example1komutu.


Örneğin

Kullanıcı kabuğu varsa cshveya zshya kshonun giriş kabuğu için ayarlayın. Senin içinde /etc/cron.d/example1yapılandırma dosyası, komut kullanmalısınız /bin/shsözdizimi. Özellikle, herhangi bir kabuk yeniden yönlendirmesi /bin/shsözdizimi olmalıdır .

Örneğin, cshkabuk yönlendirme sözdizimini kullanmaya çalışırsanız /etc/cron.d/example1, cron işiniz asla çalışmaz. İçin logfile crondbulunan /var/log/cronkomut çalıştırılır ancak komut çalıştırmak girmeden önce komut sözdizimi hatasıyla dışarı hata olacağını diyelim.

crondBir sözdizimi hatası için emit hata mesajlarını nerede yayınlar?

Hata, hiç bildirilmedi /var/log/cron. crondbunun yerine varsayılan olarak kullanarak herhangi bir hata mesajı gönderir mail. Yani /var/spool/mail/${USER}hatanın ne olduğunu görmek için kontrol etmelisiniz .

[1]

feragat

  • Bu cevap bir sysvsistem varsayar
  • systemd bilgi farklı olabilir
  • Özellikle bu bilgiler centos-6dağıtım için öğrenildi ve farklı sysvdağıtımlar için geçerli olmayabilir
    • centos-6Özellikle belirtmek isterim ; çünkü farklı dağıtımlar, farklı cronduygulamalardan farklı bir uygulamaya sahip olabilir .centos-6

2
Eğer sahip olmak isterseniz /etc/cron.d/example1komut farklı bir kabuk kullanmak, belirlediğiniz kullanabilirsiniz SHELL=sizin de /etc/cron.d/example1yapılandırma dosyası.
Trevor Boyd Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.