รันเชลล์สคริปต์ในเบื้องหลังใน Unix ในเวลาที่ระบุรายวัน


2

ฉันมีเชลล์สคริปต์ task.sh ที่จำเป็นต้องใช้ในพื้นหลังใน Unix ในเวลาที่กำหนดรายวัน

ฉันรู้ว่า nohup มีประโยชน์ในการเรียกใช้สคริปต์ในพื้นหลัง แต่กังวลเกี่ยวกับวิธีกำหนดเวลาสคริปต์นี้ให้ทำงานทุกวันตามเวลาที่กำหนด

บันทึก: ฉันไม่ใช่ผู้ใช้รูท ฉันไม่ได้รับอนุญาต crontab คำสั่ง

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมอย่างมาก.

คำตอบ:


2

วิธีที่ถูกต้องในการทำเช่นนี้คือการใช้ Crontab - หากคุณไม่มีสิทธิ์เข้าถึง crontab คุณควรพูดกับผู้ดูแลระบบของคุณ - พวกเขาอาจไม่ต้องการให้คุณทำงานตามกำหนดเวลา ที่กล่าวไว้ก่อนที่คุณจะบอกว่าไม่มีสิทธิ์สำหรับคำสั่ง crontab ลองเรียกใช้ "crontab -e" - ผู้ใช้แต่ละคนมีไฟล์ cron ของตนเองและ crontab - จะพยายามแก้ไขของคุณ (ฉันทราบเมื่อฉันเรียกใช้ crontab ด้วยตัวเองในฐานะผู้ใช้มันก็ค้าง)

คุณสามารถทำให้งานใด ๆ ทำงานในเบื้องหลังโดยการเพิ่ม "& amp;" ต่อท้าย ตัวละครกับงาน ฉันอยากจะต่อต้านสิ่งนี้ แต่คุณสามารถเขียนสคริปต์ในขณะที่ตรวจสอบเวลาจากนั้นรอหนึ่งนาทีตรวจสอบอีกครั้ง ฯลฯ และหากตรงกับการดำเนินการคำสั่ง คุณสามารถเรียกใช้สคริปต์นี้ด้วย & amp; เพื่อรันในพื้นหลัง คุณอาจประสบปัญหาในการล้มระบบ ...

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

แก้ไข

สคริปต์เพื่อตรวจสอบเวลาหนึ่งครั้งต่อนาทีและเรียกใช้คำสั่งในเวลาที่เหมาะสม:

#! /bin/bash

RUNAT="07:54"

while [ 1 ]
do
    DATE=`/bin/date +%H:%M`
    if [ $DATE. = $RUNAT. ]
    then
        /path/to/script.sh
    fi

    sleep 60
done

บันทึกสิ่งนี้เป็น (ตัวอย่าง) mycron.sh, chmod 755 mycron.sh ดังนั้นมันจะทำงาน แก้ไขบรรทัด RUNAT เพื่อเรียกใช้เมื่อคุณต้องการเรียกใช้สคริปต์จากนั้นเรียกใช้สคริปต์นี้เป็น mycron.sh & amp; ดังนั้นจึงทำงานในพื้นหลัง

สคริปต์นี้จะไม่ทำให้สแต็คใด ๆ ล้นเนื่องจากจะประมวลผลคำสั่งวันละครั้งเท่านั้น แต่จะไม่ "โยงตัวเอง"


crontab -e ไม่อนุญาต ตามที่คุณแนะนำให้เขียนสคริปต์ที่ใช้ในขณะที่วนรอบจะไม่ทำให้กองซ้อนเกินหรือไม่ และคุณพูดถึง "รอสักครู่" มันหมายถึงการใช้ sleep ?
learner1

ฉันได้แก้ไขคำตอบของฉันด้วยสคริปต์ที่เหมาะสมและคำแนะนำการใช้งาน - ใช่มันใช้โหมดสลีปไม่ใช่จะไม่ทำให้สแต็คล้น
davidgo

ขอบคุณมาก @davidgo สคริปต์ทำงานได้ดี แต่ฉันกังวลเกี่ยวกับการใช้ทรัพยากร (หน่วยความจำ, CPU) ถ้าฉันจะไม่ฆ่างานจะมีผลเสียต่อทรัพยากรหรือไม่?
learner1

ไม่รวมสคริปต์ที่คุณเรียกใช้ - ซึ่งฉันไม่สามารถให้ความเห็นได้ - ทรัพยากรที่สคริปต์ใช้นั้นมีความสำคัญเพียงเล็กน้อยบนพีซีหรือเซิร์ฟเวอร์สมัยใหม่และอาจไม่สามารถมองเห็นได้ (บันทึกเพื่อให้ปรากฏในรายการกระบวนการ ฯลฯ นับประสาอะไรก็ตาม
davidgo

1

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

ในตัวอย่างของฉันสคริปต์เขียนเฉพาะการประทับเวลาของการวิ่งครั้งสุดท้ายและทำเวลาหนึ่งนาที:

/tmp$ cat cronbyat.sh
#!/bin/sh


echo "last run: `date +%Y%m%d-%H%M%S`" >> /tmp/cronbyat.log

echo "/tmp/cronbyat.sh" | at now + 1 minute

/tmp$ echo "/tmp/cronbyat.sh" | at now + 1 minute
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 15 09:00:00 2016
/tmp$ tail -f /tmp/cronbyat.log
last run: 20160215-090000
last run: 20160215-090100
last run: 20160215-090200
last run: 20160215-090301
last run: 20160215-090400
^C
/tmp$ atq
10      Mon Feb 15 09:05:00 2016 a lx
/tmp$ atrm 10
/tmp$ atq
/tmp$

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


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