Cronjob ไม่สามารถรัน smartctl ได้?

Aug 31 2020

ฉันติดตั้ง cronjob (Ubuntu 16) ที่ทำงานร่วมกับผู้ใช้รูท ดังนั้นใน

sudo crontab -e

ฉันมีรายการต่อไปนี้:

10 5 * * mon /home/userA/raidchecker.sh

และสคริปต์raidchecker.shทำสิ่งนี้:

#!/bin/sh
mail=`which mail`
rec="[email protected] [email protected]"
now=$( date +%Y%m%d-%H%M-%S ) mdstat=$( cat /proc/mdstat )
details=$( /sbin/mdadm --detail /dev/md2 ) diskusg=$( df -kh )
disk1=$( smartctl -A /dev/sda | grep Realloc | grep Sector ) disk2=$( smartctl -A /dev/sdb | grep Realloc | grep Sector )
disk1f=$( smartctl -A /dev/sda ) disk2f=$( smartctl -A /dev/sdb )
buddyinfo=$( cat /proc/buddyinfo | grep Normal ) echo "Check from $now\n\n=================\nMemory Fragmentation:\n$buddyinfo\n\nAll partitions:\n\n$mdstat\n\n=================\nData Partition:\n\n$details\n\n=================\nDisk Usage:\n$diskusg\n\n=================\nSMARTCTL:\n\nData Disk /dev/sda and sdb:\n$disk1\n$disk2\n\nFull Reports:\nDisk1:\n$disk1f\n\nDisk2:\n$disk2f" | $mail -s "Check from $now" $rec

เมื่อฉันเรียกใช้สคริปต์ด้วยตนเองจากเชลล์./raidchecker.shอีเมลจะมีข้อมูลทั้งหมดตามที่คาดไว้

เมื่อ cronjob รันสคริปต์พารามิเตอร์ disk1, disk2, disk1f และ disk2f จะว่างเปล่า (ไม่มีข้อมูลใด ๆ )

ทำไม?

คำตอบ

1 e2-e4 Aug 31 2020 at 19:06

ใช้ crontab ส่วนใหญ่ของชุดสภาพแวดล้อมปกติสำหรับการเข้าสู่ระบบผู้ใช้ปกติจะหายไปหรือลดลง (ยกเว้นกรณีที่คุณตั้งค่า) cronเมื่อสคริปต์จะทำงานโดยอัตโนมัติ

เพื่อให้แน่ใจว่าควรระบุPATHคำสั่งที่เกี่ยวข้องหรือให้เส้นทางสัมบูรณ์สำหรับคำสั่งทั้งหมด

ทดสอบ crontab เสมอ (ตั้งเวลาสองสามนาทีหลังจากเวลาปัจจุบัน)

  • หากคุณต้องการรับ (ทางอีเมล) มาตรฐานและเอาต์พุตข้อผิดพลาดให้เพิ่มเฉพาะ 2>&1คำสั่งใน crontab
  • หากคุณไม่ต้องการรับผลลัพธ์ของคำสั่ง crontab (ทางอีเมล) ให้เพิ่ม > /dev/null 2>&1
bzero Aug 31 2020 at 16:10

วิธีแก้ปัญหาคือใช้/usr/sbin/smartctlแทนsmartctlในสคริปต์วิธีนี้เท่านั้นที่ cronjob สามารถดำเนินการคำสั่งนี้ได้