วิธีการเขียน cron ที่จะเรียกใช้สคริปต์ทุกวันในเวลาเที่ยงคืน?


144

ฉันเคยได้ยิน crontab เป็นตัวเลือกที่ดี แต่ฉันจะเขียนบรรทัดได้อย่างไรและฉันจะวางไว้บนเซิร์ฟเวอร์ได้อย่างไร

คำตอบ:


261

นี่คือบทแนะนำที่ดีเกี่ยวกับ crontab และวิธีการใช้บน Ubuntu บรรทัด crontab ของคุณจะมีลักษณะดังนี้:

00 00 * * * ruby path/to/your/script.rb

( 00 00ระบุเที่ยงคืน - 0 นาทีและ 0 ชั่วโมง - และ*ค่าเฉลี่ยทุกวันทุกเดือน)

ไวยากรณ์: 
  คำสั่ง mm hh dd mt wd

  มิลลิเมตรนาที 0-59
  ชั่วโมงชั่วโมง 0-23
  วันที่ของเดือนที่ 1-31
  mt เดือน 1-12
  wd วันในสัปดาห์ 0-7 (วันอาทิตย์ = 0 หรือ 7)
  คำสั่ง: สิ่งที่คุณต้องการเรียกใช้
  ค่าตัวเลขทั้งหมดสามารถถูกแทนที่ด้วย * ซึ่งหมายถึงทั้งหมด

1
คุณไม่พลาดคอลัมน์ 'เรียกใช้ในฐานะผู้ใช้' หรือไม่
Lucas Cimon

4
@LucasCimon คอลัมน์ผู้ใช้ (ซึ่งจะไปก่อนคำสั่ง) ได้รับอนุญาตใน/etc/crontab(บน Ubuntu) แต่เมื่อคุณเรียกใช้crontab -eคุณกำลังแก้ไข crontab เฉพาะผู้ใช้ซึ่งไม่อนุญาตให้คอลัมน์นี้ IIRC Ubuntu กีดกันการออก/etc/crontabด้วยตนเองเนื่องจากอาจถูกเขียนทับ ดูที่นี่: stackoverflow.com/questions/8475694/…
Jordan เริ่ม

@ Jordan คำตอบสำหรับ crontab สำหรับ root คือsudo crotab -u root -e
dashesy

40

จากหน้าคน

linux$ man -S 5 crontab

   cron(8) examines cron entries once every minute.

   The time and date fields are:

          field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sun, or use names)
   ...
   # run five minutes after midnight, every day
   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
   ...

มันเป็นการดีที่จะทราบ "ชื่อเล่น" พิเศษที่สามารถใช้ (บันทึกไว้ในหน้าคน) โดยเฉพาะ "@reboot" ซึ่งไม่มีทางเลือกเวลาและวันที่

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh

คุณยังสามารถใช้เคล็ดลับนี้เพื่อเรียกใช้งาน cron ของคุณหลายครั้งต่อนาที

   # Run every minute at 0, 20, and 40 second intervals
   * * * * *       sleep 00; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 20; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 40; /usr/local/sbin/run_3times_per_minute.sh

ในการเพิ่มงาน cron คุณสามารถทำหนึ่งในสามสิ่งต่อไปนี้

  1. เพิ่มคำสั่งให้กับ crontab ของผู้ใช้ดังที่แสดงด้านบน (และจาก crontab, ส่วนที่ 5, man page)

    • แก้ไข crontab ของผู้ใช้ด้วยรูทด้วย crontab -e -u <username>
    • หรือแก้ไข crontab ของผู้ใช้ปัจจุบันด้วยเพียง crontab -e
    • คุณสามารถตั้งค่าเครื่องมือแก้ไขด้วยEDITORตัวแปรสภาพแวดล้อม
      • env EDITOR=nano crontab -e -u <username>
      • หรือตั้งค่า EDITOR สำหรับเซสชันเชลล์ทั้งหมดของคุณ
        1. export EDITOR=vim
        2. crontab -e
    • ทำให้สคริปต์เรียกใช้งานได้ด้วย chmod a+x <file>


  1. สร้างสคริปต์ / โปรแกรมเป็นงาน cron และเพิ่มลงใน/etc/cron.*lyไดเรกทอรีanacron ของระบบ

    • ไดเรกทอรี anacron /etc/cron.*ly:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • ในขณะที่:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - ทำให้ปฏิบัติการได้
    • ดูเพิ่มเติมที่หน้าคน anacron: man anacron
    • ทำให้สคริปต์เรียกใช้งานได้ด้วย chmod a+x <file>
    • สคริปต์ cron. * ly เหล่านี้ทำงานเมื่อใด
      • สำหรับ RHEL / CentOS 5.x จะมีการกำหนดค่าใน/etc/crontabหรือ/etc/anacrontabให้ทำงานตามเวลาที่กำหนด
      • RHEL / CentOS 6.x + และ Fedora 17+ ระบบ Linux กำหนดได้เฉพาะในนี้/etc/anacrontabและกำหนด cron.hourly/etc/cron.d/0hourly


  1. หรือหนึ่งสามารถสร้างระบบ crontables /etc/cron.dมา

    • ไวยากรณ์ crontab ที่อธิบายไว้ก่อนหน้า (ที่มีการให้ผู้ใช้เพิ่มเติมเพื่อดำเนินการแต่ละงานเป็น) จะถูกใส่ลงในไฟล์และไฟล์จะถูกดร็อปลงในไดเร็กทอรี /etc/cron.d
    • สิ่งเหล่านี้ง่ายต่อการจัดการในบรรจุภัณฑ์ของระบบ (เช่นแพ็คเกจ RPM) ดังนั้นโดยทั่วไปอาจเป็นแอพพลิเคชั่นเฉพาะ
    • ความแตกต่างทางไวยากรณ์คือต้องระบุผู้ใช้สำหรับงาน cron หลังจากฟิลด์เวลา / วันที่และก่อนที่คำสั่งจะดำเนินการ
    • ไฟล์ที่เพิ่มเข้ามา/etc/cron.dไม่จำเป็นต้องสามารถเรียกใช้งานได้
    • นี่คือตัวอย่างงานที่ถูกเรียกใช้งานในฐานะผู้ใช้someuserและการใช้งาน/bin/bashเป็นเชลล์จะถูกบังคับ


   File: /etc/cron.d/myapp-cron
   # use /bin/bash to run commands, no matter what /etc/passwd says
   SHELL=/bin/bash
   # Execute a nightly (11:00pm) cron job to scrub application records
   00 23 * * * someuser /opt/myapp/bin/scrubrecords.php

5

บางครั้งคุณจะต้องระบุ PATH และ GEM_PATH โดยใช้ crontab กับ rvm

แบบนี้:

# top of crontab file
PATH=/home/user_name/.rvm/gems/ruby-2.2.0/bin:/home/user_name/.rvm/gems/ruby-2.2.0@global/bin:/home/user_name/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/user_name/.rvm/gems/ruby-2.2.0:/home/user_name/.rvm/gems/ruby-2.2.0@global

# jobs
00 00 * * * ruby path/to/your/script.rb
00 */4 * * * ruby path/to/your/script2.rb
00 8,12,22 * * * ruby path/to/your/script3.rb

4

คู่มือฉบับย่อเพื่อตั้งค่างาน cron

สร้างไฟล์ข้อความใหม่ตัวอย่าง: mycronjobs.txt

สำหรับแต่ละวันงาน (00:00, 03:45), บันทึกบรรทัดกำหนดการในmycronjobs.txt

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh

ส่งงานไปที่ cron (ทุกครั้งที่คุณเรียกใช้งาน cron จะลบสิ่งที่ถูกจัดเก็บและอัปเดตด้วยข้อมูลใหม่ในmycronjobs.txt )

crontab mycronjobs.txt

ข้อมูลที่เป็นประโยชน์เพิ่มเติม

ดูงาน cron ปัจจุบัน

crontab -l

ลบงาน cron ทั้งหมด

crontab -r

ไวยากรณ์ crontab ของคุณไม่ถูกต้องสำหรับ 03:45 ฟิลด์ crontab เป็นแบบนาทีต่อชั่วโมงเช่น "45 03" คุณจะต้องย้อนกลับในโพสต์ของคุณ
Russell E Glaue

1

คุณสามารถรันเชลล์สคริปต์ได้สองวิธีโดยใช้งาน cron หรือโดยการเขียนเชลล์สคริปต์

สมมติว่าชื่อสคริปต์ของคุณคือ "yourscript.sh"

ขั้นแรกให้ตรวจสอบสิทธิ์ของผู้ใช้ของสคริปต์ ใช้คำสั่งด้านล่างเพื่อตรวจสอบสิทธิ์ของผู้ใช้สคริปต์

ll script.sh

หากสคริปต์อยู่ในรูทให้ใช้คำสั่งด้านล่าง

sudo crontab -e

ที่สองถ้าสคริปต์เก็บผู้ใช้ "อูบุนตู" จากนั้นใช้คำสั่งด้านล่าง

crontab -e

เพิ่มบรรทัดต่อไปนี้ใน crontab ของคุณ: -

55 23 * * * /path/to/yourscript.sh

อีกวิธีหนึ่งในการทำเช่นนี้คือการเขียนสคริปต์และเรียกใช้ในแบ็คกราวด์

นี่คือสคริปต์ที่คุณต้องใส่ชื่อสคริปต์ของคุณ (เช่น: - youscript.sh) ซึ่งจะทำงานในเวลา 23:55 น. ทุกวัน

#!/bin/bash while true do /home/modassir/yourscript.sh sleep 1d done

บันทึกไว้ในไฟล์ (ให้ชื่อมันว่า "every-day.sh")

sleep 1d - หมายถึงมันรอหนึ่งวันแล้วมันจะทำงานอีกครั้ง

ตอนนี้ให้สิทธิ์แก่คุณ script.use ด้านล่างคำสั่ง: -

chmod + x every-day.sh

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

ใช้คำสั่งด้านล่างเพื่อรันสคริปต์

nohup ./every-day.sh &

หมายเหตุ: - หากต้องการเรียกใช้ "yourscript.sh" เวลา 23:55 น. ทุกวันคุณต้องเรียกใช้งานสคริปต์ "every-day.sh" เวลา 23:55 น.


0

ใส่ประโยคนี้ในไฟล์ crontab: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

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