find -delete tamam çalışır, ancak cron ile çalışmaz


10

LÜTFEN DİKKAT : Benzer tüm soruları yeniden okudum. cron, paths, env değişkenleri vb., ancak benim özel sorunuma çözüm sunan hiçbiri bulamadı.


Bazı MySQL dökümlerini yapar ve daha sonra böyle eski olanları siler bir komut dosyası var:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

( yukarıdaki komut yorumlardan gelen önerilerle orijinal komutumdan değiştirildi )

Ancak, cron bu komut dosyasını çalıştırdığında dosyalar asla silinmez. Cron kullanıcısı köküdür.

Hata ayıklama notları

  • Komutun göründüğü komut dosyasını el ile çalıştırırsam, bunları beklendiği gibi siler.

  • Yukarıdaki find komutunu komut satırından root olarak kendi başına çalıştırırsam, bunları beklendiği gibi siler (ve -print ile beklendiği gibi 5 günden daha eski dosyaların listesini döndürür)

  • Ayrıca kök crontab için açık bir yol ifadesi ekledim, ama
    bu bir şey değişmez.

  • Cron hata göndermiyor ve eğer bir günlük dosyasına find işlemini koyarsam,
    bu boş çıkıyor ya da hiç oluşturulmuyor.

  • Ubuntu sunucusu 14.04.03 LTS kullanıyorum.


Yolda joker karakter genişlemesinden (örneğin * .gz) kaçınırım. cron, * .gz olarak yorumlayabilir, tüm gz dosyalarını genişletemez.
Archemar

İşi bir eylem olmadan çalıştırırsanız hangi çıktıyı alırsınız/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
user9517

@Archemar Joker karakter neden genişletilmiyor? cronkomutlar kabuktan çalıştırılır ve kabuk joker karakterleri genişletir.
Barmar

cronçıktı ve hata mesajları ile e-posta göndermelidir. Bu işten böyle bir e-posta aldınız mı?
Barmar

@ Beklendiği gibi çalışıyor.
TommyPeanuts

Yanıtlar:


6

Sorun olduğunu crontabsahip değil $PATHçalıştırıldığında ayarlanır. Aslında bunu, üzerinden açılan dosyanın üstüne ekleyerek bir yol sağlayabilirsiniz crontab -e:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

(veya ne PATHkullanmayı tercih ederseniz). Bu, doğrudan cron'dan komutların tam yollarını belirtmekten kaçınabileceğiniz anlamına gelir.

Orijinal komutunuzla ilgili birden fazla sorun var. Temel olarak kabuktan joker karakter genişletmesi yapmasını istiyorsun find. İkincisi, için tam bir yol sağlamıyorsunuz rm; /bin/rmveya /usr/bin/rmsisteminizde nerede olursa olsun kullanın (bkz. which rm).

Find için ilk argüman "aranacak yer" dir ve daha sonra " -<option>s sorgusunu" çeşitli s ile belirtirsiniz . Yani, çalıştırmak istediğiniz komutun doğru formatı:

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;

veya

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

PATHYukarıdaki gibi bir tanım belirtmezseniz , şunu kullanın:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;

veya

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

1
$PATHAyarlanmış olmalı , ancak sistemin varsayılanı olacaktır. Bu, içerecektir /usr/binve /binbu nedenle rmkomutu bulabilmelidir .
Barmar

Bu yüzden crontab'a $ PATH koymayı denedim (başka bir yerde belirtildiği gibi muhtemelen belirtilmemişse sistem yolunu varsayılan olarak ayarlayacaktır) ve her şeyin tam yollara sahip olduğundan emin oldum. Ayrıca, bulma yolunda joker karakter yerine -name "* .gz" kullandım. Ama hiçbir şey olmadı. Komut çalışmıyor gibi görünüyor ve atılan hata yok.
TommyPeanuts

3

Bunun yerine deneyin

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete

Stderr'ı neden bir dosyaya yönlendiriyorsunuz? Varsayılan olarak, herhangi bir çıktı varsa e-posta ile gönderilir.
kasperd

Evet, varsayılan olarak kullanıcının biriktirici MAIL adresine herhangi bir e-posta gönderiyor ve posta kullanarak okunabiliyor.
shad0VV

1
Orijinal komutla aynı efekti elde etmek için eklemeniz gerekir -maxdepth 1.
Niels Keurentjes

0

Eğer find komutunu komut dosyasının bir parçası olarak değil de doğrudan root'un crontab'ından çağırırsam çalışır.

Söz konusu komut dosyası csh kullanır. Kökün Ubuntu üzerindeki cron ortamının / bin / bash (veya / bin / dash?) Kullanacağına inanıyorum. Belki de bu, find komutunun nasıl çalıştığı ile bir şekilde çelişir.

Her iki durumda da, çözülmemiş ana konu, biraz da olsa da.

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.