Thực thi lệnh sau vài giây (không ngủ)


15

Làm thế nào tôi có thể chạy một lệnh sau X giây mà không ngủ. Hoặc với giấc ngủ nhưng không có vỏ chỉ chờ phản hồi của lệnh đó?

Tôi đã sử dụng nhưng nó không hoạt động

sleep 5 ; ls > a.txt

Tôi cần phải chạy nó trong nền. Tôi cố gắng không phải chạy nó trong một kịch bản mà tôi cố gắng chạy lssau 5 giây và shell không chỉ chờ đến hết giấc ngủ


Tại sao nó không hoạt động mà không có vỏ? Bạn gặp lỗi gì? Bạn đang vượt qua nó con đường đầy đủ? Bạn có biết phần nào phân tích cú pháp ;không?
Hennes

bằng cách này, shell sẽ chặn 5 giây và sau đó chạy lệnh., shell bị đình trệ Tôi không cần điều đó.
Martin

Sau đó, bạn cần phải khởi động nó trong một tập lệnh ở chế độ nền hoặc trong lớp vỏ phụ.
Hennes

Câu trả lời:


34

Một cách viết ngắn gọn hơn những gì Hennes gợi ý là

(sleep 5; echo foo) & 

Ngoài ra, nếu bạn cần nhiều hơn một vài giây, bạn có thể sử dụng at. Có ba cách đưa ra lệnh cho at:

  1. Ống nó:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Lưu lệnh bạn muốn chạy trong tệp văn bản, rồi chuyển tệp đó sang at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. Bạn cũng có thể truyền atlệnh từ STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Sau đó, nhấn CtrlDđể thoát khỏi atvỏ. Các lslệnh sẽ được chạy trong một phút.

Bạn có thể đưa ra thời gian rất chính xác theo định dạng [[CC]YY]MMDDhhmm[.ss], như trong

$ at -t 201412182134.12 < script.sh

Điều này sẽ chạy tập lệnh script.shvào lúc 21 giờ 34 phút và 12 giây vào ngày 18 tháng 12 năm 2014. Vì vậy, về mặt lý thuyết, bạn có thể sử dụng atđể chạy một cái gì đó năm giây trong tương lai. Tuy nhiên, điều đó cũng giống như sử dụng xe tăng để đuổi ruồi, và gợi ý của Hennes là tốt hơn.


Tôi tiếp tục nhắn tin với $(sleep 5; echo foo) &tôi không chắc tại sao tôi nghĩ rằng tôi cần một đô la trước điều đó, nhưng với cú pháp sai của tôi, tôi chỉ đăng phiên bản dài hơn (và dễ hiểu hơn). (lệnh_for_in_new_shell) mặc dù ngắn hơn.
Hennes

@Hennes và tôi ngang nhiên gạt bỏ ý tưởng rất hay của bạn (mà tôi nêu lên). Tất cả những gì tôi đã làm là định dạng lại nó ngắn hơn, tất cả tín dụng cho các bit suy nghĩ thực tế là của bạn :).
terdon

Có cách nào để sử dụng atvới độ trễ trong vài giây không?
Vụ kiện của Quỹ Monica

@NicHartley không. Sử dụng thời gian cụ thể (ví dụ at 21:43) nếu đó là những gì bạn muốn hoặc chỉ cần làm một cái gì đó đơn giản như sleep 4 && commandchạy commandsau 4 giây.
terdon 18/03/19

4

Bạn có thể làm việc xung quanh nó bằng cách bắt đầu một shell hoặc script trong nền.

Thí dụ:

/ bin / sh -c "ngủ 5; echo foo" &
[1] 63791
> Dấu nhắc kích hoạt shell tại đây

foo 5 giây sau xuất ra.
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.