Làm thế nào để viết một cron sẽ chạy một kịch bản mỗi ngày vào nửa đêm?


144

Tôi đã nghe nói crontab là một lựa chọn tốt, nhưng làm thế nào để tôi viết dòng và tôi đặt nó ở đâu trên máy chủ?

Câu trả lời:


261

Đây là một hướng dẫn tốt về crontab là gì và cách sử dụng nó trên Ubuntu. Dòng crontab của bạn sẽ trông giống như thế này:

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

( 00 00biểu thị nửa đêm - 0 phút và 0 giờ - và *nghĩa của mỗi ngày mỗi tháng.)

Cú pháp: 
  mm hh dd lệnh mt wd

  mm phút 0-59
  hh giờ 0-23
  ngày dd tháng 1-31
  tháng 1-12
  ngày wd của tuần 0-7 (Chủ nhật = 0 hoặc 7)
  lệnh: những gì bạn muốn chạy
  tất cả các giá trị số có thể được thay thế bằng * có nghĩa là tất cả

1
Bạn không bỏ lỡ cột 'run-as-user'?
Lucas Cimon

4
@LucasCimon Cột người dùng (sẽ đi trước lệnh) được phép vào /etc/crontab(trên Ubuntu), nhưng khi bạn chạy, crontab -ebạn đang chỉnh sửa một crontab dành riêng cho người dùng, không cho phép cột này. Ubuntu IIRC không khuyến khích thoát /etc/crontabbằng tay vì nó có thể bị ghi đè. Xem tại đây: stackoverflow.com/questions/8475694/ Mạnh
Jordan Chạy

@Jordan vì vậy câu trả lời cho crontab cho root làsudo crotab -u root -e
bảnh bao

40

từ trang người đàn ông

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
   ...

Thật tốt khi lưu ý các "biệt danh" đặc biệt có thể được sử dụng (được ghi lại trong trang hướng dẫn), đặc biệt là "@reboot" không có thời gian và ngày thay thế.

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

Bạn cũng có thể sử dụng thủ thuật này để chạy công việc định kỳ của mình nhiều lần trong một phút.

   # 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

Để thêm một công việc định kỳ, bạn có thể thực hiện một trong ba điều sau:

  1. thêm một lệnh vào crontab của người dùng, như được hiển thị ở trên (và từ crontab, phần 5, trang man).

    • chỉnh sửa crontab của người dùng làm root với crontab -e -u <username>
    • hoặc chỉnh sửa crontab của người dùng hiện tại chỉ bằng crontab -e
    • Bạn có thể đặt trình chỉnh sửa với EDITORbiến môi trường
      • env EDITOR=nano crontab -e -u <username>
      • hoặc đặt giá trị EDITOR cho toàn bộ phiên shell của bạn
        1. export EDITOR=vim
        2. crontab -e
    • Tạo tập lệnh thực thi với chmod a+x <file>


  1. tạo một kịch bản / chương trình như một công việc định kỳ và thêm nó vào các /etc/cron.*lythư mục anacron của hệ thống

    • thư mục anacron /etc/cron.*ly:
      • /etc/cron.d Daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • như trong:
      • /etc/cron.d Daily / script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - làm cho nó thực thi
    • Xem thêm trang người đàn ông anacron: man anacron
    • Tạo tập lệnh thực thi với chmod a+x <file>
    • Khi nào các cron. * Ly script chạy?
      • Đối với RHEL / CentOS 5.x, chúng được cấu hình trong /etc/crontabhoặc /etc/anacrontabđể chạy tại một thời điểm đã đặt
      • Các hệ thống Linux của RHEL / CentOS 6.x + và Fedora 17+ chỉ xác định điều này trong /etc/anacrontabvà xác định cron.hourly in/etc/cron.d/0hourly


  1. Hoặc, Người ta có thể tạo hệ thống crontables trong /etc/cron.d.

    • Cú pháp crontab được mô tả trước đây (với việc cung cấp thêm người dùng để thực thi từng công việc như) được đưa vào một tệp và tệp được thả vào thư mục /etc/cron.d.
    • Đây là những thứ dễ quản lý trong bao bì hệ thống (ví dụ các gói RPM), vì vậy thường có thể là ứng dụng cụ thể.
    • Sự khác biệt cú pháp là người dùng phải được chỉ định cho công việc định kỳ sau các trường thời gian / ngày và trước lệnh để thực thi.
    • Các tập tin được thêm vào /etc/cron.dkhông cần phải được thực thi.
    • Dưới đây là một công việc ví dụ được thực thi với tư cách là người dùng someuservà việc sử dụng /bin/bashnhư shell là bắt buộc.


   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

Đôi khi, bạn sẽ cần chỉ định PATH và GEM_PATH bằng crontab với rvm.

Như thế này:

# 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

Hướng dẫn nhanh để thiết lập công việc định kỳ

Tạo một tệp văn bản mới, ví dụ: mycronjobs.txt

Đối với mỗi công việc hàng ngày (00:00, 03:45), hãy lưu các dòng lịch biểu trong mycronjobs.txt

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

Gửi công việc tới cron (mỗi khi bạn chạy cái này, cron sẽ xóa những gì đã được lưu trữ và cập nhật với thông tin mới trong mycronjobs.txt )

crontab mycronjobs.txt

Thêm thông tin hữu ích

Xem công việc định kỳ hiện tại

crontab -l

Xóa tất cả các công việc định kỳ

crontab -r

Cú pháp crontab của bạn không chính xác cho 03:45. Các trường crontab là Phút sau đó là Giờ, tức là "45 03" - bạn có nó ngược trong bài viết của mình.
Russell E Glaue

1

Bạn có thể thực thi tập lệnh shell theo hai cách, bằng cách sử dụng cron job hoặc bằng cách viết tập lệnh shell

Giả sử tên tập lệnh của bạn là "minecript.sh"

Đầu tiên kiểm tra sự cho phép của người dùng của tập lệnh. sử dụng lệnh dưới đây để kiểm tra sự cho phép của người dùng của tập lệnh

sẽ script.sh

Nếu đoạn script nằm trong root, thì hãy sử dụng lệnh bên dưới

sudo crontab -e

Thứ hai nếu tập lệnh giữ người dùng "ubfox", sau đó sử dụng lệnh bên dưới

crontab -e

Thêm dòng sau vào crontab của bạn: -

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

Một cách khác để làm điều này là viết một kịch bản và chạy nó trong backgroud

Đây là kịch bản mà bạn phải đặt tên tập lệnh của mình (ví dụ: - youscript.sh) sẽ chạy vào lúc 23:55 tối mỗi ngày

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

lưu nó trong một tập tin (cho phép đặt tên là "every-day.sh")

ngủ 1ngày - có nghĩa là nó đợi một ngày rồi nó lại chạy.

bây giờ cấp quyền cho tập lệnh của bạn. Sử dụng lệnh bên dưới: -

chmod + x every-day.sh

bây giờ, thực thi tập lệnh shell này trong nền bằng cách sử dụng "nohup". Điều này sẽ tiếp tục thực thi tập lệnh ngay cả sau khi bạn đăng xuất khỏi phiên của mình.

sử dụng lệnh dưới đây để thực thi kịch bản.

nohup ./every-day.sh &

Lưu ý: - để chạy "minecript.sh" lúc 23:55 tối hàng ngày, bạn phải thực thi tập lệnh "every-day.sh" vào đúng 23:55 tối.


0

Đặt câu này trong tệp crontab: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.