เมื่อฉันวิ่ง:
watch 'cmd >> output.txt' &
งานที่ถูกระงับโดยระบบ:
3569 หยุดทำงาน (เอาต์พุต tty)
มีวิธีแก้ปัญหาหรือไม่?
เมื่อฉันวิ่ง:
watch 'cmd >> output.txt' &
งานที่ถูกระงับโดยระบบ:
3569 หยุดทำงาน (เอาต์พุต tty)
มีวิธีแก้ปัญหาหรือไม่?
คำตอบ:
วัตถุประสงค์watch
คือเพื่อแสดงผลลัพธ์ของคำสั่งแบบเต็มหน้าจอและอัปเดตอย่างต่อเนื่อง หากคุณเปลี่ยนเส้นทางการส่งออกไปยังไฟล์และพื้นหลังก็ไม่มีเหตุผลที่จะใช้การเฝ้าดูในสถานที่แรก
หากคุณต้องการเรียกใช้คำสั่งซ้ำแล้วซ้ำอีกด้วยการหน่วงเวลา ( watch
รอสองวินาทีโดยค่าเริ่มต้น) คุณสามารถใช้สิ่งนี้:
while true; do
cmd >> output.txt
sleep 2
done
นี่คือวิธี:
watch -n 1 'date' &>/dev/null &
เนื่องจากคุณเป็นผู้กำหนดกระบวนการเราสามารถสันนิษฐานได้ว่าคุณไม่ต้องการจอแสดงผลเทอร์มินัลและคุณสามารถเปลี่ยนเส้นทางไปยังไฟล์ได้ หากคุณทำเช่นนั้นคุณจะสามารถพื้นหลังwatch
โดยไม่มีปัญหา
sleep
ตามคำแนะนำของ Michael Mrozek จะช้าลงอย่างช้าๆ นอกเหนือจากเชลล์สคริปต์ที่ซับซ้อนที่ตรวจสอบเวลาของระบบและดำเนินการคำสั่งตามเวลาที่ผ่านไปแล้วwatch -p
อาจเป็นตัวเลือกที่ดีสำหรับการกำหนดเวลาที่แม่นยำ
สำหรับการกำหนดเวลาที่แม่นยำ:
watch -n 1 -p 'date' &>/dev/null &
&
สองครั้ง
man bash
เพื่อดูว่าการ&
ทำงานครั้งแรก ;)
ฉันไม่แน่ใจเกี่ยวกับแรงจูงใจของคุณ แต่อาจจะเพียงพอหรือไม่
while true; do sleep 2; cmd >>output.txt; done &
watch
มิฉะนั้นโปรดอธิบายว่าทำไมคุณต้องการจริงๆ
tee
เป็นเพื่อนของคุณ. ตัวอย่างเช่นต่อไปนี้เป็นวิธีที่คุณสามารถแสดงจำนวนไฟล์ในไดเรกทอรีปัจจุบันและผนวกเข้ากับ count.txt ทุก 2 วินาที:
watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'
ขึ้นอยู่กับแรงจูงใจของคุณ:
คุณต้องการเรียกใช้บางสิ่งบางอย่างเป็นระยะ จากนั้นคุณสามารถใช้ cron โดยตรง (หากเวลามีความละเอียด 1 นาทีก็เพียงพอสำหรับวัตถุประสงค์ของคุณ)
คุณต้องการเรียกใช้บางอย่างซ้ำ ๆ :
while sleep 2 ; do
cmd
done >& log.txt
(คุณสามารถเรียกใช้สิ่งนี้ได้จาก crontab แม้ว่าจะแนะนำให้ใช้สคริปต์)
คุณต้องการรันคำสั่งเป็นระยะและสามารถเข้าถึงเอาต์พุตของการประมวลผลครั้งล่าสุด
คุณสามารถเขียนผลลัพธ์ไปยัง ramfs (แก้ไขสคริปต์ก่อน):
while sleep 2 ; do
cmd >& last_execution.log
done
หรือดีกว่า:
while sleep 2 ; do
cmd >& last_execution.log.tmp
mv last_execution.log.tmp last_execution.log ## atomically
done
คุณสามารถรวมscreen
และwatch
เพื่อให้คุณสามารถตรวจสอบสถานะล่าสุดได้ตลอดเวลาตราบใดที่มันเหมาะกับหน้าจอเดียว:
screen watch -n 3660 ./make-backup.sh
คุณสามารถใช้คำสั่งหน้าจอ
http://www.cyberciti.biz/tips/linux-screen-command-howto.html
หากคุณต้องใช้watch
- เพียงรวมคำตอบจากไมค์ dangeloและl0b0
watch -n 1 'cmd | tee -a output.txt' &>/dev/null &
เช่น
watch -n 1 'date | tee -a output.txt' &>/dev/null &
จากนั้นดูวินาทีที่ผ่านไป
tail -f output.txt
นาฬิกาออกแบบมาเพื่อส่งออกไปยังหน้าจอ แต่สามารถเปลี่ยนเส้นทางของเอาต์พุต (ทั้ง stdout และ stderr) จากนั้นมันจะทำงานในพื้นหลัง
watch 'date >>fa' >/dev/null 2>/dev/null &