2009-05-12 21 views
9

Bir cron işi var, bir PHP betiğini çalıştırıyor. Cron her dakika çalışacak şekilde ayarlanmıştır, bu sadece test amaçlı yapılır. Çalıştırdığı PHP betiği, kullanıcılar tarafından sunucuya yüklenen videoları flash formatına dönüştürmek için tasarlanmıştır (ör. ... .flv). Komut, komut satırı üzerinden el ile gerçekleştirilirken düzgün yürütülür, ancak cron ile yürütülürken iyi başlar ancak bir dakika sonra durur.Bir cron işi son cron uygulamasını öldürüyor mu?

Bir sonraki cron yürütüldüğünde, son cron yürütmesini "öldürür". Ben şu PHP işlevi eklendi:

ignore_user_abort(true); 
son yürütülmesine iptal olmaz umuduyla

, ben iyi çalışan her 5 dakikada bir çalışacak şekilde cron'u ayarı test edilen, ancak bir videonun dönüşüm ele geçirebilir 5 dakika bu yüzden başka bir cronun neden çalıştırıldığını anlamaya ihtiyacım var.

Herhangi bir yardım için teşekkür ederiz.

Teşekkür ederiz!

*/1 * * * * php /path_to_file/convert.php 
+0

PHP hata günlüğünü kontrol ettiniz mi? Zaman sınırını 0 olarak ayarlamak için set_time_limit kullandınız mı? –

+0

Hata yok, zaman sınırını da 0 olarak ayarlıyorum. Daha önce bahsetmeyi unuttum cron şunun gibi görünüyor:

 */1 * * * * php /path_to_file/convert.php 
Teşekkürler! –

+0

Görünüşe bakılırsa, cron işi son olarak ne çalıştığı üzerine yazmıyor, PHP kodunda bir sorun vardı. Çıktığından emin olmak için bir kontrol ekledim, ancak Sander'in bahsettiği geçici bir kilit dosyası ekledim. Teşekkürler! –

cevap

17

Cron'un herhangi bir işlemi öldürdüğünü sanmıyorum. Ancak, cron uzun süre çalışan süreçler için uygun değildir. Burada olan şey, komut dosyanızın, birden çok kez çalıştırıldığında kendi kendine başa çıkmasıdır. Örneğin, her iki PHP işlemi de aynı dosyaya aynı anda yazmaya çalışıyor olabilir.

İlk olarak, sadece php hata günlüğünde bakmak değil, aynı zamanda PHP dosyasına kendisinden çıkış yakalamak deneyin emin olun. E.g: convert.php'nin birden çok kez çalıştırılmadığından emin olmak için basit bir lockfile da kullanabilirsiniz. Şunlar gibi:

if (file_exists('/tmp/convert.lock')) { 
    exit(); 
} 

touch('/tmp/convert.lock'); 
// convert here 
unlink('/tmp/convert.lock'); 
+3

cron Bir işlemi BIRAKMAYIN. Komut dosyası (ya da betiğin çağırdığı bir şey) kendi yoluna çıkıyor. –

3

cron kendisi kadar çalışan bir iş önceki bir örneğini durmayacak bir sorun varsa bunu yaparken sizin PHP şey neredeyse kesin var,:

DÜZENLEME: gibi My cron görünüyor. Bu kodu göndermeniz gerekecek.

1

Hayır, olmayacaktır. Her bir işlem için komut dosyasının denetlediği bir kilit dosyası oluşturarak ikinci bir işlemin çalışmasını engelleyebilirsiniz. Dosya varsa, çalışmaz. Bu da uygunsa, bir işlemin süresiz olarak gelecekteki infazları durdurmaması için maksimum bir yürütme süresi ile birlikte kullanılmalıdır. Kilit dosyası sadece /tmp/foo.lock adlı boş bir düz metin dosyası olabilir.