ฉันจะเรียกใช้งาน 'watch` เป็นงานพื้นหลังได้อย่างไร?


คำตอบ:


26

วัตถุประสงค์watchคือเพื่อแสดงผลลัพธ์ของคำสั่งแบบเต็มหน้าจอและอัปเดตอย่างต่อเนื่อง หากคุณเปลี่ยนเส้นทางการส่งออกไปยังไฟล์และพื้นหลังก็ไม่มีเหตุผลที่จะใช้การเฝ้าดูในสถานที่แรก

หากคุณต้องการเรียกใช้คำสั่งซ้ำแล้วซ้ำอีกด้วยการหน่วงเวลา ( watchรอสองวินาทีโดยค่าเริ่มต้น) คุณสามารถใช้สิ่งนี้:

while true; do
    cmd >> output.txt
    sleep 2
done

มีวิธีทำเช่นนี้ในแบบที่ไม่มีการปิดกั้นหรือไม่? ตัวอย่างเช่นถ้าฉันต้องการวางคำสั่งนี้และคำสั่งอื่น ๆ ไว้ในสคริปต์ทุบตีเดียวและมันยังคงรันโค้ดที่ตามหลังมานี้ (ในขณะที่ยังคงทำสิ่งนี้อยู่ในพื้นหลัง) หรือไม่?
ออสติน

14

นี่คือวิธี:

watch -n 1 'date' &>/dev/null &

เนื่องจากคุณเป็นผู้กำหนดกระบวนการเราสามารถสันนิษฐานได้ว่าคุณไม่ต้องการจอแสดงผลเทอร์มินัลและคุณสามารถเปลี่ยนเส้นทางไปยังไฟล์ได้ หากคุณทำเช่นนั้นคุณจะสามารถพื้นหลังwatchโดยไม่มีปัญหา

sleepตามคำแนะนำของ Michael Mrozek จะช้าลงอย่างช้าๆ นอกเหนือจากเชลล์สคริปต์ที่ซับซ้อนที่ตรวจสอบเวลาของระบบและดำเนินการคำสั่งตามเวลาที่ผ่านไปแล้วwatch -pอาจเป็นตัวเลือกที่ดีสำหรับการกำหนดเวลาที่แม่นยำ

สำหรับการกำหนดเวลาที่แม่นยำ:

watch -n 1 -p 'date' &>/dev/null &

ขออภัยมันทำงานอย่างไร เหตุใดจึงเป็นไปได้ที่จะใช้&สองครั้ง
phil294

อ่านส่วนของไปป์man bashเพื่อดูว่าการ&ทำงานครั้งแรก ;)
Mioriin

11

ฉันไม่แน่ใจเกี่ยวกับแรงจูงใจของคุณ แต่อาจจะเพียงพอหรือไม่

while true; do sleep 2; cmd >>output.txt; done &

watchมิฉะนั้นโปรดอธิบายว่าทำไมคุณต้องการจริงๆ


2

teeเป็นเพื่อนของคุณ. ตัวอย่างเช่นต่อไปนี้เป็นวิธีที่คุณสามารถแสดงจำนวนไฟล์ในไดเรกทอรีปัจจุบันและผนวกเข้ากับ count.txt ทุก 2 วินาที:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'

2

ขึ้นอยู่กับแรงจูงใจของคุณ:

  • คุณต้องการเรียกใช้บางสิ่งบางอย่างเป็นระยะ จากนั้นคุณสามารถใช้ cron โดยตรง (หากเวลามีความละเอียด 1 นาทีก็เพียงพอสำหรับวัตถุประสงค์ของคุณ)

    • หมายเหตุ: ถ้าช่วงเวลาสั้นมากหรืออุปกรณ์มีข้อ จำกัด มากและถ้าคุณไม่กำหนดค่า syslog เพื่อบันทึกข้อความน้อยลงจาก crond มันจะเติม syslog ของคุณอย่างรวดเร็ว
  • คุณต้องการเรียกใช้บางอย่างซ้ำ ๆ :

    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


0

หากคุณต้องใช้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

0

นาฬิกาออกแบบมาเพื่อส่งออกไปยังหน้าจอ แต่สามารถเปลี่ยนเส้นทางของเอาต์พุต (ทั้ง stdout และ stderr) จากนั้นมันจะทำงานในพื้นหลัง

watch 'date >>fa' >/dev/null 2>/dev/null &
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.