Kết thúc một lệnh chạy quá lâu

Một script/command có thể chạy nhanh hoặc chậm tùy tình huống. Thí dụ lệnh find trên một thư mục webdav/davfs có thể chạy hàng giờ nếu mạng chậm và làm cho không thể ssh RPi, mặc dù có thể ping.

Chúng ta có thể buộc script/command này kết thúc sau một thời gian n giây định trước, tuy nhiên không khéo lại làm cho script/command luôn luôn chạy trong n giây mặc dù nó có thể kết thúc sớm hơn.

Một giải pháp là dùng lệnh timeout, cú pháp là

timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]

Thí dụ:

find /mnt/box.com/* -mindepth 2 -maxdepth 2 -type d -ctime +$nday -exec rm -rf '{}' \;

Lệnh trên tìm trong thư mục webdav /mnt/box.com các thư mục con cấp 2 được tạo ra trước thời điểm chạy lệnh $nday ngày, và xóa nó đi. Lệnh này có khi chạy rất chậm và làm nghẻn mạng. Chúng ta đành phải kết thúc nó nếu chạy chậm hơn 5 phút, bằng cách thêm vào timeout 5m trước câu lệnh find:

timeout 5m find /mnt/box.com/* -mindepth 2 -maxdepth 2 -type d -ctime +$nday -exec rm -rf '{}' \;

Tuy nhiên, câu lệnh vẫn có thể không tự kết thúc được, khi đó cần phải dùng lệnh kill sau khi chờ đợi nó trong 7 phút

timeout -k 7m 5m find /mnt/box.com/* -mindepth 2 -maxdepth 2 -type d -ctime +$nday -exec rm -rf '{}' \;

Chi tiết về lệnh timeout có thể xem qua lệnh timeout –help

Leave a Comment

Filed under Software

Leave a Reply

Your email address will not be published. Required fields are marked *