يعطي بيثون في سو كرون ناتجًا مختلفًا عن التنفيذ يدويًا

StackOverflow https://stackoverflow.com/questions/2384327

  •  24-09-2019
  •  | 
  •  

سؤال

خادم 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 ليست بالضرورة هي نفس قذيفة تسجيل الدخول الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top