os.popen ส่งคืนสตริงว่างเมื่อถูกเรียกจาก cron


1

ฉันพยายามรับการใช้งาน CPU ของ Raspberry Pi ดังนี้:

def get_cpu_usage():
    return os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()

เมื่อดำเนินการตามปกติวิธีนี้จะคืนค่าการใช้งานที่ถูกต้องเช่น "7.2" เมื่อถูกเรียกจาก cron มันจะส่งคืนสตริงว่าง

crontab ของฉันมีลักษณะเช่นนี้:

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

* * * * * python /home/pi/sysinfo/dashboard.py

ผมทำอะไรผิดหรือเปล่า?


ที่จริงแล้วมันไม่ได้ส่งคืนสตริงที่ถูกต้องคุณควรใช้top -bn 2 -d 0.01แทนดูคำตอบของฉันที่นี่สำหรับข้อมูลเพิ่มเติม
terdon

คำตอบ:


4

โดยปกติเมื่อบางสิ่งไม่ทำงานตามแผนเมื่อทำงานผ่าน cron แต่ทำงานได้ดีเมื่อคุณลองในเทอร์มินัลปัญหาเกิดจากหนึ่งในสองสิ่งที่เป็นไปได้:

  • cron ไม่มี $ PATH (หรือโดยทั่วไปสภาพแวดล้อม) ที่คุณคุ้นเคยหรือคาดหวัง สิ่งนี้สามารถแก้ไขได้ในระดับหนึ่งโดยเพียงแค่ระบุเส้นทางแบบเต็มไปยังทุกสิ่งการตั้งค่าตัวแปรสภาพแวดล้อมที่เหมาะสมภายใน cron หรือในสคริปต์ที่คุณเรียกใช้ผ่าน cron และสามารถดำเนินการตั้งค่าที่จำเป็นก่อนเรียกใช้คำสั่งจริง
  • cron ไม่เรียกใช้คำสั่งผ่าน TTY มีหลายสิ่งที่ไม่สนใจและกลับไปใช้รูปแบบเอาต์พุตที่มีเหตุผลหากมีการรันโดยไม่มี TTY ที่แนบมา แต่บางสิ่งก็สนใจ topจะดูแลโดยค่าเริ่มต้นและจะต้องบอกว่าไม่สนใจ ฉันไม่รู้ว่า Python os.popen()จัดสรร TTY หรือไม่ แต่ฉันค่อนข้างสงสัย

โดยเฉพาะในกรณีของคุณคุณสามารถหลีกเลี่ยงปัญหาโดยการเพิ่มพารามิเตอร์-b topตามที่อธิบายไว้ใน man page:

-b: การทำงานของโหมดแบตช์

เริ่มด้านบนในโหมด 'แบทช์' ซึ่งอาจเป็นประโยชน์สำหรับการส่งเอาต์พุตจากด้านบนไปยังโปรแกรมอื่นหรือไปยังไฟล์ ในโหมดนี้ด้านบนจะไม่รับอินพุตและทำงานจนกว่าจะมีการทำซ้ำ จำกัด คุณได้ตั้งค่าด้วยตัวเลือกบรรทัดคำสั่ง '-n' หรือจนกว่าจะถูกฆ่า


ขอบคุณสำหรับคำอธิบายและวิธีแก้ปัญหานี่เป็นเคล็ดลับ! :)
Peter W.

1

คุณอาจต้องเพิ่มPYTHONPATHตัวแปรในcrontabไฟล์ของคุณ- เป็นไปได้ว่าimport osคำสั่งของคุณ(ซึ่งฉันถือว่าอยู่ที่ด้านบนของdashboard.pyไฟล์ของคุณ) ไม่ทำงาน คุณจะต้องตรวจสอบไดเรกทอรีที่แน่นอนในเครื่องของคุณ แต่มันควรจะเป็นบางสิ่งตามแนว/usr/local/lib/pythonX.X/ที่X.Xเป็นรุ่นของ Python ที่คุณใช้อยู่


สิ่งที่แปลกคือฉันใช้os.popen("/opt/vc/bin/vcgencmd get_config arm_freq")เพื่อรับนาฬิกา CPU เพียงไม่กี่บรรทัดข้างบนหนึ่งสำหรับการใช้งาน CPU และที่ใช้งานได้
Peter W.

@PeterW ฟังดูคล้ายกับอาการของปัญหา PATH ซึ่งเป็นเรื่องธรรมดาเมื่อทำงานผ่าน cron อาจเป็นได้ว่าtopตรวจพบว่าไม่ได้ทำงานบน TTY และล้มเหลวเนื่องจากสาเหตุดังกล่าว
CVn

@ MichaelKjörlingมีวิธีอื่นในการรับการใช้งาน CPU ที่ไม่พึ่งพาคำสั่งที่อาจหรือไม่ล้มเหลวขึ้นอยู่กับว่าพวกเขาทำงานที่ไหน?
ปีเตอร์ดับเบิลยู.

@PeterW ดูคำตอบของฉันสำหรับสิ่งที่อาจเป็นวิธีแก้ปัญหา
CVn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.