Làm thế nào để chạy một công việc cron chỉ một lần?


14

Tôi có một công việc chạy mãi mãi ngay khi nó bắt đầu. Vì vậy, tôi muốn khởi động nó chỉ một lần sau khi nhập nó vào tập tin "crontab -e" và lưu nó (hoặc) bất cứ khi nào khởi động lại.

Làm thế nào để đạt được điều này?

Câu trả lời:


22

Nếu bạn muốn một lệnh chạy một lần vào một ngày sau đó, hãy sử dụng atlệnh.

Nếu bạn muốn một lệnh được chạy một lần khi khởi động hệ thống, giải pháp chính xác là sử dụng một trong hai:

  • tập lệnh RC hệ thống (/etc/rc.local)
  • crontab với @reboottiền tố đặc biệt (xem trang chủ)

Cái sau là tùy chọn duy nhất cho người dùng không root.


2
+1 để đề cập đến @reboot.
Alex Holst

Tôi luôn thích sử dụng /etc/rc.local nếu có thể ... Tôi nghi ngờ rằng @reboot thực sự chạy các lệnh khi khởi động crond, không phải khởi động hệ thống. Sự khác biệt tinh tế nhưng có thể.
MikeyB

giả sử tôi đã nhập @reboot "cmd ............." vào tệp crontab và lưu nó. Lệnh này sẽ bắt đầu bây giờ chứ? (hoặc) Nó chỉ bắt đầu sau khi khởi động lại?
Rama Vadakattu

Hãy dùng thử và xem :) Những gì bạn có thể cần làm là đưa nó vào crontab, sau đó lên lịch để thực hiện ngay bằng cách sử dụngat now
MikeyB

Câu trả lời tốt. Tôi luôn quên về @reboot.
Bill Weiss

9

Bạn có thể sử dụng tại (1) để điều hành công việc tại một thời điểm nào đó trong tương lai. Tuy nhiên, nếu bạn muốn chạy một cái gì đó khi khởi động và nó sẽ tự chạy, có lẽ bạn muốn một mục trong /etc/init.d/ cho nó? Điều đó sẽ cho phép bạn bắt đầu nó khi khởi động.


1
Bạn cũng có thể sử dụng RC.local. Các lệnh trong /etc/rc.local "sẽ được thực thi sau tất cả các tập lệnh init khác. Bạn có thể đặt công cụ khởi tạo của riêng mình vào RC.local nếu bạn không muốn thực hiện công cụ khởi động kiểu Sys V đầy đủ."
Joe

Joe: gọi tốt.
Bill Weiss

Làm thế nào để dừng quá trình bắt đầu bằng lệnh? (tôi biết tiêu diệt id process sau khi xem danh sách id process bằng cách sử dụng "lệnh ps", điều này có hoạt động với "at lệnh" không). Việc tạo tập lệnh tùy chỉnh có dễ không?
Rama Vadakattu

Có cho cả hai. Tất cả các quy trình có thể bị ngừng sử dụng kill(giả sử bạn đã có quyền để làm như vậy, điều mà bạn làm cho các quy trình của riêng bạn). Làm một init script thực sự dễ dàng. Tìm kiếm /etc/init.d/một tập lệnh không dài và mô hình hóa tập lệnh của bạn sau tập lệnh đó hoặc google cho making init scripts (your distribution).
Bill Weiss

1
Rất nhiều bản phân phối bao gồm tập lệnh bộ xương ( /etc/init.d/skeletontrên openSuSE) mà bạn có thể điều chỉnh để sử dụng.
MikeyB

3

Một công việc chỉ chạy một lần và chạy mãi cho đến khi bạn bảo nó chết được gọi là "daemon". Chúng thường được bắt đầu thông qua các tập lệnh init trong /etc/init.d/.

Nếu công việc của bạn kết thúc tại một số thời điểm và có thể được coi là một loại công việc một lần, thì bạn có thể muốn xem lệnh tại. Chẳng hạn, nếu tôi muốn chạy lệnh find lúc 10 giờ tối nay và chỉ điều này một lần tôi sẽ làm:

$ at 10PM
at> find /root > /root/find_results.list
at> <EOT>
job 3 at 2010-02-10 22:00

1

Có một cái nhìn vào lệnh


Điều gì sẽ xảy ra khi các hệ thống được khởi động lại? Tôi có cần phải nhập "tại lệnh" không?
Rama Vadakattu

Các mục tại lệnh sẽ không bị mất trong quá trình khởi động lại. ibm.com/developerworks/linux/l Library / l- job-scheduling.html là một giới thiệu thú vị về lập kế hoạch công việc
Dominik

@Rama Vadakattu: "Các mục lệnh tại sẽ không bị mất trong quá trình khởi động lại." ... Điều đó chưa được thực hiện. Xem câu trả lời của MikeyB .
Tạm dừng cho đến khi có thông báo mới.

ok tôi sẽ làm nhiều nghiên cứu hơn về điều này.
Rama Vadakattu
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.