เป็นไปได้ไหมที่จะรันงาน cron ทุก ๆ 30 วินาทีโดยไม่มีคำสั่ง sleep?
เป็นไปได้ไหมที่จะรันงาน cron ทุก ๆ 30 วินาทีโดยไม่มีคำสั่ง sleep?
คำตอบ:
หากงานของคุณต้องทำงานบ่อยครั้ง cron เป็นเครื่องมือที่ผิด นอกเหนือจากข้อเท็จจริงที่ว่ามันจะไม่เริ่มงานที่บ่อยครั้งคุณยังเสี่ยงกับปัญหาร้ายแรงบางอย่างหากงานใช้เวลาในการรันนานกว่าช่วงเวลาระหว่างการเปิดตัว เขียนซ้ำภารกิจของคุณเพื่อ daemonize และเรียกใช้อย่างต่อเนื่องจากนั้นเปิดใช้ cron ถ้าจำเป็น
run-one
เพื่อให้แน่ใจว่าโปรแกรม / แม้กระทั่งสคริปต์ PHP ไม่ได้เริ่มต้นอินสแตนซ์ที่ซ้ำกัน sudo apt-get install run-one
และเรียกมันโดยrun-one <normal command>
ผู้สมัครเพื่อการใช้งานอย่าง ผิดพลาดที่สุดของคำสั่ง Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
ถ้าyourprog
ประกอบด้วย:
date +%M.%S.%N >> yourprog.out
จากนั้นyourprog.out
อาจมีลักษณะเช่น:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
บ่งบอกถึงระดับความแม่นยำที่ค่อนข้างดี
นี่คือคำอธิบายของส่วนต่าง ๆ ของคำสั่ง:
nohup
- สิ่งนี้จะเก็บคำสั่งที่ตามมาwatch
ในกรณีนี้จากการออกเมื่อเทอร์มินัลออกwatch
- โปรแกรมนี้รันคำสั่งซ้ำ ๆ โดยปกติหน้าจอแรกของเอาต์พุตจากคำสั่งจะถูกแสดงทุกครั้งที่watch
รันคำสั่ง-n 30
- ช่วงเวลาที่เรียกใช้คำสั่ง ในกรณีนี้คือทุก ๆ สามสิบวินาที--precise
- หากไม่มีตัวเลือกนี้ให้watch
รันคำสั่งหลังจาก ช่วงเวลาวินาที ด้วยคำสั่งเริ่มต้น แต่ละคำสั่งจะเริ่มต้นในช่วงเวลาถ้าเป็นไปได้ หากตัวเลือกนี้ไม่ได้ระบุไว้ในตัวอย่างเวลาจะได้รับในภายหลังและต่อมามากกว่า 30 วินาทีในแต่ละครั้งเนื่องจากเวลาที่จะเปิดตัวและดำเนินการคำสั่ง ( yourprog
)yourprog
- โปรแกรมหรือบรรทัดคำสั่งสำหรับwatch
การดำเนินการ หากบรรทัดคำสั่งมีอักขระพิเศษสำหรับเชลล์ (เช่น space หรือเซมิโคลอน) จะต้องมีการเสนอราคา>/dev/null
- ยิ่งกว่าการเปลี่ยนเส้นทางการส่งออกของคำสั่งที่ถูกเรียกใช้โดยไปยังแฟ้มwatch
/dev/null
ไฟล์นั้นจะทิ้งข้อมูลใด ๆ ที่ถูกเขียนไป นี้จะช่วยป้องกันการส่งออกจากการถูกเขียนไปยังหน้าจอหรือตั้งแต่มีการใช้จะป้องกันไม่ให้เอาท์พุทจากการถูกส่งไปยังไฟล์ที่เรียกว่าnohup
nohup.out
&
- watch
คำสั่งรันในพื้นหลังและการควบคุมจะถูกส่งกลับไปยังเทอร์มินัลหรือกระบวนการหลักโปรดทราบว่าการnohup
เปลี่ยนเส้นทางของการส่งออกและการที่ผู้ประกอบการควบคุมพื้นหลังไม่ได้เฉพาะเจาะจงกับ&
watch
นี่คือคำอธิบายของyourprog
สคริปต์ตัวอย่าง:
date
- ส่งออกวันที่และ / หรือเวลาปัจจุบัน นอกจากนี้ยังสามารถตั้งค่าได้+%M.%S.%N
- สิ่งนี้ระบุรูปแบบผลลัพธ์ที่date
จะใช้ %M
คือนาทีปัจจุบัน%S
เป็นวินาทีปัจจุบันและ%N
เป็น nanosecond ปัจจุบัน>> yourprog.out
- นี้เปลี่ยนเส้นทางการส่งออกของคำสั่งไปยังไฟล์ที่เรียกว่าdate
yourprog.out
ยิ่งใหญ่กว่าเป็นสองเท่าทำให้เอาต์พุตถูกผนวกเข้ากับไฟล์ในแต่ละการเรียกใช้แทนที่จะเป็นเนื้อหาก่อนหน้านี้ที่ถูกเขียนทับแก้ไข :
อาจเป็นอีกสิ่งหนึ่งที่อาจถูกทารุณกรรม (หรืออาจเป็นการใช้ที่ถูกกฎหมาย) คือตัวจับเวลา systemd
ดูsystemd / ตัวจับเวลาแทน cronและCron VS จับเวลา
ฉันจะลองโพสต์ตัวอย่างเร็ว ๆ นี้
&
สาเหตุของคำสั่งที่จะทำงานในพื้นหลังกลับการควบคุมคำสั่งพร้อมรับคำทันที การใช้nohup
คำสั่งทำให้กระบวนการที่อยู่เบื้องหลัง (ในกรณีนี้watch
) ละเว้นสัญญาณ Hangup ที่ส่งเมื่อเชลล์ออกเช่นเมื่อคุณปิดเทอร์มินัล ...
>/dev/null
สาเหตุทำให้เอาต์พุตถูกยกเลิกและป้องกันการสร้างnohup.out
ไฟล์ซึ่งจะถูกสร้างขึ้นเมื่อเอาต์พุตมาตรฐานเป็นเทอร์มินัล
sleep
คุณจะต้องเขียนวนซ้ำเพื่อให้กระบวนการทำซ้ำ ( watch
นี่จะเป็นการทำซ้ำสำหรับคุณเช่นเดียวกับcron
) คุณยังคงต้องและnohup
&
ปัญหาที่เพิ่มเข้ามาsleep
คือการเลื่อนเวลา --precise
ตัวเลือกในการwatch
หลีกเลี่ยงนี้ หากไม่มีมันหรือเมื่อใช้sleep
ในการวนรอบช่วงเวลาจะมีเวลาสำหรับคำสั่งหรือสคริปต์ที่จะเรียกใช้เพิ่มเข้าไปดังนั้นแต่ละการเรียกใช้จะได้รับในภายหลังและหลังจาก ...
Cron ถูกออกแบบมาให้ตื่นขึ้นทุกนาทีดังนั้นจึงเป็นไปไม่ได้ที่จะทำโดยไม่มีการแฮ็กเช่นนอนหลับอย่างที่คุณพูดถึง
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
อย่าลืมที่จะเขียนบางสิ่งบางอย่างลงในโปรแกรมของคุณเพื่อให้มันออกหากอินสแตนซ์ก่อนหน้านี้ทำงานอยู่
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
แน่นอนว่านี่ยังทำให้โอกาสในการล้มเหลวมีน้อยมากดังนั้นให้ค้นหา google เพื่อหาทางออกที่ดีกว่าสำหรับสภาพแวดล้อมของคุณ
without a sleep command
ฉันมีข้อกังวลสองสามข้อ:
(1) บางครั้งระบบไม่ว่างและไม่สามารถเริ่มสิ่งต่าง ๆ ได้อย่างตรงจุดในเวลา 30 วินาทีมันอาจเป็นไปได้ว่าในเวลาเดียวกันคุณกำลังทำงานหนึ่งงานอีกงานหนึ่งจะปรากฏขึ้นและคุณมีงาน 2 (หรือมากกว่า) ที่ทำแบบเดียวกัน สิ่ง. อาจมีการรบกวนที่สำคัญขึ้นอยู่กับสคริปต์ ดังนั้นการเขียนโค้ดในสคริปต์ดังกล่าวควรมีรหัสบางอย่างเพื่อประกันว่ามีเพียงหนึ่งอินสแตนซ์ของการสร้างสคริปต์ที่ทำงานในเวลาเดียวกัน
(2) สคริปต์อาจมีโอเวอร์เฮดจำนวนมากและใช้ทรัพยากรระบบมากกว่าที่คุณต้องการ สิ่งนี้เป็นจริงถ้าคุณแข่งขันกับกิจกรรมของระบบอื่น ๆ มากมาย
ดังนั้นอย่างที่ผู้โพสต์คนหนึ่งได้วางไว้ในกรณีนี้ฉันจะพิจารณาวาง daemon อย่างจริงจังโดยใช้กระบวนการเพิ่มเติมเพื่อให้แน่ใจว่าโปสเตอร์ยังคงทำงานอยู่หากมีความสำคัญอย่างยิ่งต่อการดำเนินงานของคุณ
รายการ cron:
* * * * * flock -w0 /path/to/script /path/to/script
สคริปต์:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
หรือ
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
คำสั่งหลีกเลี่ยงการเรียกใช้สคริปต์จากหลาย ๆ อินสแตนซ์ในเวลาเดียวกัน อาจมีความสำคัญมากในกรณีส่วนใหญ่flock
และwatch
คำสั่งนั้นมีอยู่ในการติดตั้ง Linux ส่วนใหญ่watch
คำสั่งวิธีแก้ปัญหาถ้าเป็นเพื่อสคริปต์ของคุณเองหรือถ้าคุณสามารถสรุปได้:
ปวดหัวน้อยกว่าการสร้างและเฝ้าดูภูต
* ถ้าคุณใช้ PHP ให้จำ clearstatcache ()