Làm thế nào để chạy một lệnh trong nền với độ trễ?


33

Ai đó có thể chỉ cho tôi cách tạo một chương trình để thực hiện hành động này không: sau 5 phút

echo "80" > /sys/class/leds/blue/brightness

Tôi muốn chương trình này chạy trong nền (như rngddịch vụ) Tôi không thể làm điều này vì tôi không biết nhiều về Linux.

Câu trả lời:


51
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

Bằng cách đó, tập lệnh của bạn tiếp tục hoặc bạn khôi phục điều khiển ngay lập tức, trong khi tác vụ nền mới của tập lệnh bắt đầu, với hai lệnh: ngủ và lặp lại.

Các lỗi phổ biến đang cố gắng để cung cấp cho một trong hai sleephoặc echohoặc cả hai &mà sẽ không làm việc như dự định. Khởi chạy một loạt các lệnh ()mặc dù sinh ra chúng trong một quy trình shell riêng biệt, sau đó bạn có thể gửi toàn bộ vào nền &.


Với sự dí dỏm đó, nơi tôi thấy nó tích cực hữu ích. Trong một thiết bị nhúng, tôi phát triển ứng dụng chính hoạt động với cơ quan giám sát. Nếu nó thất bại theo cách kích hoạt thiết lập lại watchdog ngay sau khi khởi động, lặp đi lặp lại, thật khó để khắc phục từ xa vì khoảng thời gian giữa hệ điều hành khởi động và thiết lập lại khá ngắn, không đủ để ssh in và chặn khởi động ứng dụng. Vì vậy, tôi cần một cách để xác định hệ thống khởi động lại quá nhanh và đưa ra độ trễ nếu có, để cho mình thời gian để sửa nó bằng tay.

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

Nếu tôi đăng nhập và thực hiện touch /tmp/noautostartứng dụng chính sẽ không bắt đầu. Nếu cơ quan giám sát khởi động, rm /tmp/startdelaysẽ không được thực hiện và lần sau khi hệ thống khởi động, nó sẽ cho tôi thêm 30 giây để ngăn chặn nó. Nếu không thì khởi động lại sẽ nhanh chóng, không chậm trễ.


Có, tôi đồng ý, nhưng đó cũng có thể là một phần trong phản ánh của người dùng ;-)
Kiwy

Các câu trả lời khác dường như bỏ lỡ phần "trong nền". Không, tôi đã khá rõ ràng về điều đó: /
goldilocks

@goldilocks: Bạn đã thêm phần gửi vào nền sau khi tôi đăng câu trả lời của mình.
SF.

Không, câu trả lời ban đầu của tôi là chạy một chức năng chứa giấc ngủ &để làm nền cho giấc ngủ; "Bạn cũng cần phải làm nền cho giấc ngủ" ngay từ đầu. Nếu bạn không tin tôi, hãy nhìn vào lịch sử chỉnh sửa. Và câu trả lời của tôi lớn hơn bạn 5 phút: P
goldilocks

1
@gekannt: ... uh, câu hỏi là "Làm thế nào để chạy một lệnh trong nền với độ trễ?" - làm thế nào bạn sẽ đạt được nó nếu không? (và không, nếu bạn không làm nền cho ()nhóm, lớp vỏ ban đầu sẽ tạm dừng cho đến khi lớp được sinh ra kết thúc.)
SF.

11

sử dụng atlệnh

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

nó sẽ chạy trong nền


2
Đây là cách đúng đắn để làm điều đó, nhưng nó cần daemon atd đang chạy và trên hầu hết các hệ thống sẽ cần phải có một gói cài đặt.
Julian

Bạn có thể sử dụng dấu ngoặc đơn để tránh thoát, và echohoàn toàn từ bỏ bằng cách sử dụng một di sản hoặc di truyền.
Chris Down

@Julian, atlà một lệnh POSIX tiêu chuẩn. Hệ thống giống Unix nào không có sẵn theo mặc định?
Stéphane Chazelas

1
@ StéphaneChazelas - câu hỏi hay. Tôi biết tôi đã có vấn đề này nhưng nó đã được một thời gian trước đây. Tôi đã kiểm tra một chút và lệnh at có vẻ khá phổ biến. Ngoài ra, có vẻ như atd là dành riêng cho Linux và thậm chí trên một số hệ thống Linux có thể được thay thế bằng trình nền cron kiểu BSD. Hãy xem xét nhận xét của tôi đã lỗi thời.
Julian

Tôi đã thử 'tại' và không tìm thấy lệnh nào trên Android 8
beppe9000

6

Nếu bạn muốn một cái gì đó chạy trong 5 phút, nhưng phần còn lại của chương trình của bạn sẽ tiếp tục (hoặc kết thúc), bạn cũng cần phải ngủ nền:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

Điều này sẽ in hellovà sau đó 3 giây (sau khi chương trình chính đã thoát), in world.

Phần quan trọng là &để rẽ nhánh thực hiện chức năng vào nền.


1
Tôi có thể đề nghị runWithDelay () { sleep $1; "${@:2}"; }thay thế?
manatwork

1
Tôi nghĩ rằng nó nên đọc doWhateverWithDelay 3 &trong ví dụ thứ hai của bạn.
Baarn

@manatwork: Chúc mừng.
goldilocks

1
@goldilocks, điều cần thiết trong việc sử dụng $@là bạn có thể trích dẫn nó và sẽ được mở rộng dưới dạng danh sách các từ được trích dẫn. Vì vậy, tốt hơn làm cho nó "$@"(hoặc "${@}"nếu bạn thích niềng răng). Xem pastebin.com/MU7hbB2C
manatwork

@manatwork: Điểm lấy;) Tôi đã thử sử dụng args với echo ( -n), nhưng rõ ràng đó là một chút ngây thơ.
goldilocks
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.