Unix: ngủ đến thời gian quy định


12

Có một lệnh Unix (bán) tiêu chuẩn nào sẽ ngủ cho đến khi thời gian được chỉ định trên dòng lệnh của nó không? Nói cách khác, tôi đang tìm kiếm thứ gì đó tương tự sleepsẽ mất thời gian thức dậy hơn là thời lượng.

Ví dụ: sleeptill 05:00:00

Tôi có thể mã hóa một cái gì đó nhưng không muốn phát minh lại bánh xe nếu có cái gì đó ở ngoài đó.

Câu hỏi thưởng: sẽ thật tuyệt nếu nó có thể lấy múi giờ (như trong sleeptill 05:00:00 America/New_York).

chỉnh sửa Do bản chất của những gì tôi đang làm, tôi đang tìm kiếm một giải pháp "ngủ cho đến khi T" thay vì "chạy lệnh tại T".

chỉnh sửa Để tránh nghi ngờ, nếu tôi chạy lệnh lúc 18:00 và bảo nó thức dậy lúc 17:00, tôi hy vọng nó sẽ ngủ trong 23 giờ (hoặc, trong một số trường hợp góc phải làm với thời gian tiết kiệm ánh sáng ban ngày, trong 22 hoặc 24 giờ.)


Bạn có thể sử dụng cron, tôi đoán.
Bobby

Cảm ơn, nhưng với mục đích sử dụng, nó thực sự phải sleepgiống như vậy.
NPE

Câu trả lời:


18

Nếu bạn đang sử dụng Unix có lệnh ngày tốt và đang sử dụng bash, bạn có thể sử dụng định dạng% s để tính thời gian.

sleep $(( $(date -j 1700 +%s) - $(date +%s) ))

(1700 là 5 giờ chiều và -j nói ngày không thực sự ấn định ngày)


(+1) cho đề xuất. Nếu tôi chạy lệnh lúc 18:00 và bảo nó thức dậy lúc 17:00, tôi dự đoán nó sẽ ngủ trong 23 giờ (hoặc, trong một số trường hợp góc phải làm với thời gian tiết kiệm ánh sáng ban ngày, trong 22 hoặc 24 giờ). Đây là nơi đề nghị không may bị phá vỡ. [Tôi cũng đã phải thay đổi -jđể -d. Để làm cho nó chạy trên các hệ thống Linux của tôi]
NPE

7
@aix: Trên Linux (và các hệ thống khác có ngày GNU), bạn có thể sử dụng các thông số kỹ thuật ngày phức tạp như date -d 'tomorrow 17:00'.
Gilles 'SO- ngừng trở nên xấu xa'

3
@NPE, btw, người ta có thể bù bằng cách sử dụng phân chia nhắc nhở: echo $(( ($(date -d "3:00" +%s) - $(date +%s) + (60*60*24)) % (60*60*24) ))(có thể chỉ có một số vấn đề xung quanh các thay đổi DST)
hvr

13

Làm thế nào về điều này (kết hợp các ý tưởng của w00t và Gille vào một chức năng)?

function sleep_until {
  seconds=$(( $(date -d "$*" +%s) - $(date +%s) )) # Use $* to eliminate need for quotes
  echo "Sleeping for $seconds seconds"
  sleep $seconds
}

Sử dụng:

sleep_until 8:24
Sleeping for 35 seconds

sleep_until '23:00'
Sleeping for 52489 seconds

sleep_until 'tomorrow 1:00'
Sleeping for 59682 seconds

9

Kiểm tra các linux / unix atlệnh . Sử dụng ví dụ 5AM:

at 05:00 some_command

Nó cũng hỗ trợ múi giờ:

Tên múi giờ của GMT, UCT hoặc ZULU (không phân biệt chữ hoa chữ thường) có thể theo sau để chỉ định rằng thời gian nằm trong Giờ quốc tế phối hợp. Các múi giờ khác có thể được chỉ định bằng cách sử dụng biến môi trường TZ.


(+1) cho đề xuất. Thật không may, nó không phù hợp tự nhiên với quy trình làm việc của tôi. Tôi có một kịch bản chạy một loạt các thứ tự theo trình tự và tôi muốn đảm bảo rằng các bước nhất định sẽ không được khởi động cho đến những thời điểm nhất định. Điều này tất nhiên có thể được chuyển đổi thành một cái gì đó sử dụng cronhoặc at, nhưng nó sẽ là một nỗi đau để quản lý. Đây là lý do tôi đang tìm kiếm một cái gì đó sleepgiống như. Bây giờ, tôi đã viết riêng của tôi.
NPE

Ah, vì vậy bạn muốn một lịch trình chặn. Tại sao không có một tập tin nhà nước theo dõi từng bước của quy trình?
Jeremy L

Có thể làm, nhưng nó có vẻ phức tạp hơn tôi nghĩ nó cần phải được. Các bước là các lệnh khác nhau và tập lệnh shell là thứ phối hợp quy trình công việc. Có thể "ngủ đến 5 giờ chiều" trong kịch bản là tất cả những gì tôi thực sự cần.
NPE

Trong trường hợp đó, câu trả lời của w00t có thể chính xác là những gì bạn đang theo đuổi.
Jeremy L

Vâng, nó chắc chắn trong tinh thần đúng. Đáng buồn thay, nó bị hỏng trong một số trường hợp quan trọng (với tôi) và không làm múi giờ.
NPE
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.