Friday, 14 June 2013

[bash] Tắt máy tự động

7h, cu Hít muốn đi ăn cơm nhưng chương trình wget vẫn đang download dở đống file và chẳng biết bao giờ mới xong.
7h 01, cu Hít định gõ sudo shutdown -h 120 để máy sẽ tắt sau 120 phút, nhưng lúc ấy nhỡ chưa xong thì sao?!!!
7h 02, nghĩ...
7h 03, một ý tưởng vô cùng bình thường mà không tầm thường đã nảy ra, cu Hít thò tay vào test

Ý tưởng rằng, khi wget chạy, nó sẽ xuất hiện khi grep output của lệnh `ps`. Nếu nó không còn ở đó nữa nghĩa là đã xong, lúc ấy thì tắt máy.
Nếu chuyển đoạn trên sang bash sẽ là: lặp cho đến khi không còn thấy wget trong output của lệnh `ps`, rồi shutdown.

7h 04, mọi thứ đã sẵn sàng, gõ thôi:

sudo -s # phải thành root thì mới shutdown được chứ
while $(ps -ef | grep [w]get -q); do sleep 60; date >> /home/hvn/wget.log; done; shutdown -h now
câu lệnh trên tạo 1 vòng lặp vô hạn cho đến khi không còn tìm thấy wget trong output của lệnh `ps -ef`. Sau mỗi lần kiểm ra điều kiện ấy thì chờ 60 giây rồi kiểm tra lại, ghi thời gian kiểm tra vào 1 file text để biết khi nào xong, tắt máy khi vòng lặp while kết thúc.

grep [w]get  # giúp chỉ tìm dòng lệnh chứa từ khóa wget mà không tính đến lệnh grep vừa chạy.
grep -q # trả về 0 nếu tìm thấy từ khóa, trả về 1 nếu không tìm thấy 

7h 05, có lẽ khỏi cần ghi thời gian ra file vì khi máy tắt chính là lúc download xong (sai lệch 1 phút), có thể kiểm tra bằng lệnh `last`

while $(ps -ef | grep [w]get -q); do sleep 60; done; shutdown -h now
PS: cu Hít là một nhân vật hư cấu, không có thật. :3