Thuận tiện sắp xếp một lệnh để chạy sau?


87

Cách đơn giản để chạy lệnh, giả sử, 8 giờ kể từ bây giờ? Tôi có thể nghĩ theo cách này:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Có cách nào "đúng đắn" hơn không?


Có điều gì đó sai với nohup+ sleep? Tại sao nó "không đúng"?
cprn

Câu trả lời:


123

Bạn có thể sử dụng atlệnh. Các atlệnh thực thi sau đó. Các attiện ích có trách nhiệm đọc lệnh từ đầu vào tiêu chuẩn và nhóm chúng lại với nhau như một ít công việc, được thực hiện tại một thời điểm sau đó.

Thông thường, atđược cài đặt theo mặc định trong Ubuntu, nhưng nếu bản phát hành của bạn không bao gồm nó, hãy cài đặt qua:

sudo apt-get install at

Để biết thêm thông tin, các tùy chọn, ví dụ và những thứ khác, hãy xem Kho lưu trữ trang chủ Ubuntu

Thí dụ:

at now +8 hours -f ~/myscript.sh

Bạn cũng có thể sử dụng các tốc ký thuận tiện, như tomorrowhoặc noon, như trong

echo "tweet fore" | at teatime 

Cảnh báo: Điều này sẽ chạy lệnh ở bên trái của đường ống ngay lập tức nhưng chỉ xuất hiện đầu ra của nó sau đó. Ví dụ này cũng cho thấy cách bạn có thể dẫn các hành động vàoat. at -clà cách bạn có thể kiểm tra các hành động được lên lịch, mà bạn có thể liệt kê một cách thuận tiện với số của chúng, như với:

at -c 3

19
Nó có thể là hữu ích để thêm một ví dụ sử dụng đơn giản mà giải quyết câu hỏi poster gốc đặc biệt ví dụ như hơnat now +8 hours -f ~/myscript.sh
steeldriver

6
Ngoài ra, at 8:00phải chạy lệnh vào một thời điểm tuyệt đối và batchcho "khi có vẻ như máy tính không hoạt động"
Simon Richter

4
Trong trường hợp bất cứ ai đã tự hỏi, teatimelà lúc 4 giờ chiều. Vì một số lý do, nó không được đề cập trong manpages.ubfox.com/manpages/rared/man1/at.1poseix.html nhưng nó nằm trong man atvà ở đây manpages.ubfox.com/manpages/rared/en/man1/at.1.html .
Dan

3
Có lẽ chúng ta có thể đề cập rằng tiện ích "tại" không được cài đặt theo mặc định và nếu có ai muốn nhận nó chỉ cần cài đặt gói "tại"? Chỉnh sửa: Dù sao, tôi chỉ cần chỉnh sửa câu trả lời (cũng đã sửa liên kết manpage).
đau khổ

4
Coi chừng đường ống vào lúc sẽ chạy lệnh ngay lập tức và chỉ lên lịch đầu ra. Tôi đã có một bản in 3D 4 giờ thất bại vì tôi muốn lên lịch gpio write 8 1nhưng nó đã được thực hiện ngay lập tức.
Maciej Swic

8

Có, bạn có thể thiết lập một công việc định kỳ.

Ví dụ: nếu bây giờ thời gian là 14:39:00 và hôm nay là thứ Sáu, 30 tháng 8, bạn có thể thêm công việc định kỳ sau (sẽ được thực hiện sau 8 giờ) trong tệp crontab của bạn bằng crontab -elệnh:

39 22 30 8 5  /path/to/mycommand.sh

Thông tin thêm về:


3
Ok, vâng, tôi nên đề cập đến tôi biết về công việc Cron. Điều này thậm chí còn lộn xộn hơn bởi vì sau đó nó ngồi xung quanh trong crontab vô thời hạn, phải không?
Steve Bennett

4
@ RaduRădeanu: với cron, hãy cẩn thận rằng nó có thể bắn lại sau vài năm nữa (khi có một ngày 30 tháng 8 khác xảy ra vào thứ sáu) ...
Olivier Dulac

2
Đây là một hack thông minh. Tuy nhiên, "tại" là một cách tốt hơn nhiều. Điều gì sẽ xảy ra nếu máy tính bị tắt lúc 14:39?
emory

1
Err đó vẫn không phải là quan điểm của tôi. Quan điểm của tôi là văn bản bạn đã nhập sẽ (tôi nghĩ) theo nghĩa đen vẫn đang ngồi trong crontab của bạn sau sự kiện, tạo ra một nhiệm vụ dọn dẹp khác cho bạn.
Steve Bennett

2
@SteveBennett Vâng, bạn đã đúng. Lệnh sẽ vẫn còn trong của bạn crontabcho đến khi bạn loại bỏ nó. Một năm sau, khi bạn quên mất ai đã đặt nó ở đó và tại sao, bạn sẽ phải gãi đầu tự hỏi phải làm gì với mệnh lệnh.
Paddy Landau

8

Sử dụng giao diện Gnome có trụ sở tại cron, atvà những thứ tương tự:

Việc giới thiệu CronHowto gợi ý sử dụng gnome-schedulegui, sẽ tốt hơn nhiều so với việc nhập tất cả rác vào thiết bị đầu cuối (đặc biệt đối với người dùng Ubuntu "trung bình" không phải là người dùng "power" * nix / bsd.)

Chạy nó bằng cách sử dụng Unity Dash (hoặc menu ứng dụng khác) để tìm Nhiệm vụ theo lịch hoặc chạy gnome-schedule.

Trên các hệ thống Ubuntu dựa trên Gnome Công cụ tác vụ theo lịch trình Gnome (từ gói gnome-calendar) trong Ứng dụng -> Công cụ hệ thống cung cấp giao diện đồ họa với lời nhắc sử dụng Cron. Trang web của dự án có tại http://gnome-schedule.sourceforge.net/ ; phần mềm có thể cài đặt từ Trung tâm phần mềm hoặc bằng cách nhập

sudo apt-get install gnome-schedule

trong một thiết bị đầu cuối.

Sử dụng gnome-schedule, đối với tập lệnh trong thư mục chính của bạn, lệnh "at" mới sẽ được thiết lập bằng loại cửa sổ này:

nhập mô tả hình ảnh ở đây


5

Tôi đã tìm ra một cách nhanh chóng và bẩn thỉu để làm điều này trước khi tôi phát hiện ra atlà một điều.

Giả sử bạn muốn tập lệnh của mình chạy vào buổi trưa:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Giả sử bạn muốn nó chạy vào ngày mai vào buổi trưa (hôm nay là ngày 24 tháng 11 đối với tôi):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Cập nhật : Phương pháp tốt hơn một chút: chỉ kiểm tra các số bạn quan tâm, sử dụng date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...

10
Để hai người đã bỏ phiếu tán câu trả lời này, hãy sử dụng at, cronhoặc bất kỳ ứng dụng lên lịch thực khác. Lập kế hoạch nhiệm vụ là khó khăn, và không phải là một bánh xe bạn nên phát minh lại.
dimo414

1
@ dimo414 Có gì sai với phương pháp của tôi?
wjandrea

8
Ở mức tối thiểu, đó là sự chờ đợi bận rộn, thật lãng phí. Tệ hơn, nó không được đảm bảo là chính xác; điều đó là hoàn toàn có thể (nếu không có khả năng) cho điều kiện bị bỏ qua. Dựa trên lịch trình của bạn trên các biểu thức thông thường cũng rất dễ bị lỗi. Nó có thể hoạt động đủ tốt , nhưng không có lợi thế hơn at.
dimo414

(Ngoài ra: Tôi không đánh giá thấp câu trả lời của bạn, tôi chỉ không nghĩ mọi người nên sử dụng nó)
dimo414

4
Một lý do khác để sử dụng atlà vì công việc của nó sẽ tồn tại khi khởi động lại.
manatwork
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.