2013-09-22 23 views
50

Tôi có tệp văn bản có chứa ngày và giờ cụ thể. Tôi muốn có thể chạy tập lệnh tại thời điểm được chỉ định trong tệp đó. Bạn sẽ đạt được điều đó như thế nào? Tạo một tập lệnh khác chạy trong nền (sắp xếp một dấu chấm câu) và kiểm tra từng giây nếu thời gian hiện tại khớp với thời gian trong tệp? Có cách nào khác không? Máy là một máy chủ linux, Debian wheezy. Cảm ơn trướcLinux Cách chạy tập lệnh tại một thời điểm nhất định?

+3

Bất kỳ lý do nào cron không hoạt động? – lreeder

+2

Tại sao chủ đề này đóng lại ?? Đó là một câu hỏi rất hợp lý. Tìm kiếm của Google dẫn bạn đến điều này là # 1 Và câu trả lời là khá tuyệt vời.Vì vậy, ai đó có thể trả lời câu hỏi này là tiếng Anh rõ ràng sẽ bị chặn – Richard

+0

@Richard Tôi nghi ngờ lý do StackOverflow đang đóng quá nhiều câu hỏi như thế này là khuyến khích người dùng đặt câu hỏi không có chủ đề ở đây trên trang web StackExchange thích hợp. Có khá nhiều trang SE mới mà trước đây không tồn tại. Ví dụ, có khá ít [câu hỏi Vim rất hữu ích] (https://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118) trên SO đã được đóng như chủ đề, và bây giờ có một Vi/Vim SE, những câu hỏi đó sẽ là chủ đề ở đó. Chỉ cần suy nghĩ. Tuy nhiên, điều này vẫn có vẻ như một câu hỏi lập trình – mgarey

Trả lời

101

Nhìn vào những điều sau:

echo "ls -l" | at 07:00 

Mã này dòng thực thi "ls -l" tại một thời điểm cụ thể. Đây là một ví dụ về thực hiện một cái gì đó (một lệnh trong ví dụ của tôi) tại một thời điểm cụ thể. "at" là lệnh bạn đang thực sự tìm kiếm. Bạn có thể đọc các thông số kỹ thuật ở đây:

http://manpages.ubuntu.com/manpages/precise/en/man1/at.1posix.html http://manpages.ubuntu.com/manpages/xenial/man1/at.1posix.html

Hy vọng nó sẽ giúp!

+2

gặp lỗi '' 'Không thể mở /var/run/atd.pid để báo hiệu atd. Không có atd chạy? '' 'Bất kỳ đầu mối? – HappyCoding

+0

Bạn cần 'atd' daemon đang chạy để sử dụng' at'. Trên Manjaro OpenRC, bạn chỉ có thể cài đặt 'at-openrc' và thêm dịch vụ daemon atd với:' sudo rc-update add atd' và bắt đầu với 'sudo rc-service atd start'. Thông thường gói 'at' đã bao gồm một' systemd' (hệ thống init/service mặc định trên các dịch vụ linux distro khác nhau bao gồm cả Ubuntu), nó có thể được bắt đầu bằng 'sudo systemctl start atd' và cho phép tự khởi động trên init với' sudo systemctl enable atd'. –

+0

Trong trường hợp của tôi, bản in ra "lệnh 6 ở 2017-08-21 10:53" ngay lập tức ... – Jewenile

4

Thông thường trong Linux, bạn sử dụng crontab cho loại công việc được khắc phục này. Nhưng bạn phải xác định thời gian khi bạn "thiết lập bộ đếm thời gian" - vì vậy nếu bạn muốn nó được cấu hình trong chính tệp đó, bạn sẽ phải tạo một số cơ chế để làm điều đó.

Nhưng nói chung, bạn sẽ sử dụng ví dụ:

30 1 * * 5 /path/to/script/script.sh 

sẽ thực thi kịch bản mỗi Thứ Sáu lúc 1:30 (AM) đây:

30 là phút

1 được giờ

2 * tiếp theo là day of monthmonth (trong th theo thứ tự) và 5 là ngày trong tuần

+1

vậy làm thế nào bạn sẽ kích hoạt lệnh đó? –

10

Lệnh at tồn tại riêng cho mục đích này (không giống như cron nhằm mục đích lập lịch các tác vụ lặp lại).

at $(cat file) </path/to/script 
+0

với bash, bạn muốn viết '$ (

5

Cron phù hợp với thứ gì đó sẽ chạy định kỳ, như mọi thứ Bảy lúc 4 giờ sáng. Ngoài ra còn có anacron, hoạt động xung quanh tắt nguồn, ngủ và không hoạt động. Cũng như tại.

Nhưng đối với một giải pháp một lần, điều đó không yêu cầu root hay gì cả, bạn chỉ có thể sử dụng ngày để tính toán giây-từ-kỷ nguyên của thời gian mục tiêu cũng như thời điểm hiện tại, sau đó sử dụng expr để tìm sự khác biệt và ngủ nhiều giây.

+5

Lệnh 'at' sẽ vẫn được lên lịch ngay cả khi máy được khởi động lại trong thời gian chờ đợi. – tripleee

Các vấn đề liên quan