يعطي بيثون في سو كرون ناتجًا مختلفًا عن التنفيذ يدويًا
سؤال
خادم Ubuntu 9.10 ، إليك ملف بلدي ، test.py
import commands
blkid = commands.getoutput('blkid')
print blkid
عندما أركض يدويًا (مثل SU) هذا:
python test.py
أحصل على إخراج Blkid كما هو متوقع:
/dev/sda1: UUID="3f0ac5bb-f0da-4574-81f5-77844530b561" TYPE="ext4"
/dev/sda5: UUID="67df0e7c-74fb-47dd-8520-ad720fbed67d" TYPE="swap"
/dev/sdb1: UUID="85466892-8dae-461c-95da-b8f91c2e766b" TYPE="ext3"
/dev/sdc1: UUID="91b84635-21c2-4d9a-84f8-2bbaab16d41f" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdd1: UUID="6a52c830-0029-4154-80cb-f17274eb6fed" SEC_TYPE="ext2" TYPE="ext3"
ومع ذلك ، عندما أضيف هذا إلى su crontab:
* * * * * python /home/myusername/test.py > /home/myusername/output
المحتوى من انتاج يصبح:
sh: blkid: not found
ماذا أفتقد هنا؟ هو بيثون الأوامر الوحدة النمطية فقط لبعض الأوامر الخاصة بـ SH؟ أنا فقط أحاول تشغيل أمر النظام والتقاط الإخراج إلى متغير يمكنني تحليله.
المحلول
ربما تكون المشكلة مع $PATH
مقابل روت (os.environ['PATH']
إذا كنت تنظر إليه في بيثون بدلاً من الصدفة ؛-). عادة ما يكون مسار الجذر متحفظًا للغاية (سيكون من المخاطرة ألا يكون!) وبما أنك تعمل blkid
دون تحديد مسار مطلق قد يعني بسهولة أنه في طريقك ولكن ليس الجذر.
القيام بذلك which blkid
كنفسك في موجه قذيفة ، sudo su
أو على أي حال تصبح جذر ، و echo $PATH
- يمكنك التحقق بسرعة من المشكلة. ثم تقوم بإصلاحه باستخدام المسار الكامل المطلق لـ BLKID في getoutput
استدعاء بدلاً من مجرد المعرف العاري blkid
كما تفعل الآن.
نصائح أخرى
البيئة (والمسار) لوظيفة CRON ليست بالضرورة هي نفس قذيفة تسجيل الدخول الخاصة بك.