2016-04-09 12 views
1

Çıktısını ayrıştırmak için perl betiğinde "lvs" çalıştırmaya çalışıyorum.Linux LVM lvs komutu, cron perl betiğinden başarısız oluyor ancak cron'dan doğrudan çalışıyor

my $output = `lvs --noheadings --separator : --units m --nosuffix 2>&1`; 
my $result = $?; 
if ($result != 0 || length($output) == 0) { 
    printf STDERR "Get list of LVs failed (exit result: %d): %s\n", 
    $result, $output; 
    exit(1); 
} 
printf "SUCCESS:\n%s\n", $output; 

Yukarıdaki betiği bir terminal penceresinden çalıştırdığımda düzgün çalışıyor. Cron ile çalıştırmak başarısız:

Get list of LVs failed (exit result: -1): 

Not bir çıkış eksikliği (stdout'u + stderr'yi)

aynı çalıştırmak "lvs --separator --noheadings: m --units - nosuffix "doğrudan cron komutu, çalışır ve çıktılar iyi.

Eğer open3() kullanmak için perl betiğini değiştirirsem, aynı hatadan da çıktı alırım.

"-d -d -d -d -d -v -v -v" lb komutunu verbose/debug çıktısını etkinleştirmek için eklerseniz, perl betiğini terminalden çalıştırdığımda görüyorum ancak cron/perl ile çalıştırıldığında çıkış yok.

Ben RHEL 7.2 bu çalıştırıyorum/usr/bin/perl (5.16.3)

herhangi bir öneriniz ile ???

cevap

0

lvs mutlak yolunu kullanmayı deneyin:

my $output = `/sbin/lvs --noheadings --separator : --units m --nosuffix 2>&1`; 
2

perldoc system göre, "-1 Dönüş değeri program veya bekleme (2) sistem çağrısı bir hata başlatmak için bir başarısızlık gösterir ($ incelemek Nedeni için "Yani çıktı yok çünkü nedeni lvs başarıyla başlatılmıyor.

Cron ile ilgili sorunların olağan doğası göz önüne alındığında, çalışmanın başarısız olma olasılığının en büyük sebebi, cron tarafından kullanılan $PATH üzerinde olmamasıdır. Tam yolu belirtmeyi deneyin ve eğer çalışmazsa, işletim sisteminin hata mesajı için $!'u işaretleyin.

+1

Evet, problem şu ki, cron + içinde $ PATH, "lvs" olduğu yerde/sbin içerecek şekilde ayarlanmamıştır. Yani "/ sbin/lvs" ifadesini belirterek sorunu giderir. Teşekkür ederim!!! –