Làm thế nào để tắt máy tính sau khi hoàn thành một nhiệm vụ?


25

Tôi thường bắt đầu tải xuống trước khi đi học.
Tôi nên sử dụng lệnh nào để tự động thực hiện các lưu cần thiết và tắt máy tính sau khi hoàn thành một tác vụ cụ thể?
(Nói, sau khi cài đặt các bản cập nhật hoặc sau khi tải xuống một tệp lớn.)

Tôi cũng đã đăng chéo tại Askubfox .

Câu trả lời:


25

Nó phụ thuộc vào bạn bắt đầu nhiệm vụ. Nếu đó là một số công cụ dòng lệnh, bạn có thể chỉ cần chạy halthoặc shutdown -h now:

  1. wget http://..../somelargefile; halt- haltsẽ được thực hiện sauwget

  2. wget http://..../somelargefile && halt- haltsẽ được thực thi nếu wgettrả về không có lỗi

  3. wget http://..../somelargefile || halt- haltsẽ được thực thi nếu wgettrả về lỗi

Thay thế cho việc này đang sử dụng kshutdown- trong ứng dụng này, bạn có thể chỉ định hành động nào nên được thực hiện (khởi động lại / tắt máy / hibernate / etc hoặc thực thi lệnh) và khi nào (sau một thời gian hoặc khi một ứng dụng khác thoát ra). Nếu bạn muốn sử dụng công cụ này, bạn cần chọn đúng quy trình - một số tiện ích cập nhật bắt đầu một vài quy trình con.

KShutdown


4
Bạn cũng có thể cho shutdownmột thời gian để chờ đợi; không cần sử dụng kshutdown cho mục đích đó.
Cascabel

1
Không, nhưng shutdownkhông có cách nào để chờ đợi một sự kiện thực tế.
Shadur

18

Mỗi tiến trình có một thư mục được đặt tên theo id tiến trình của nó (pid) trong prochệ thống tập tin. Do đó, bạn có thể đợi kết thúc một quy trình cụ thể bằng cách kiểm tra xem thư mục của nó có tồn tại nhiều lần hay không.

Bạn có thể sử dụng điều này để thực hiện tắt hệ thống sau khi chấm dứt quá trình như thế này (thay thế 2296 bằng pid để chờ):

su -c 'while [[ -d /proc/2296 ]]; do sleep 1; done; poweroff'

Ưu điểm:

  • Bạn có thể quyết định có tắt máy hay không sau khi tắt lệnh shell
  • Việc tắt máy được ban hành dưới dạng root, lệnh chờ không nhất thiết phải được thực hiện dưới quyền root (không cần phải giải quyết sudodấu nhắc mật khẩu muộn ).

Nhược điểm:

  • Có thể xảy ra quá trình của bạn chấm dứt và HĐH sau đó sử dụng lại cùng một quy trình cho một quy trình mới được sinh ra trong khoảng thời gian thứ hai đó (điều kiện cuộc đua). Do đó, bạn sẽ tiếp tục chờ đợi quá trình mới đó chấm dứt.

2
Điểm chính: Điều này hoạt động ngay cả khi quá trình đã bắt đầu.
Heisenberg

Nếu bạn đã bắt đầu một cái gì đó từ một thiết bị đầu cuối mà bạn vẫn mở pstrong cùng một thiết bị đầu cuối đó sẽ giúp bạn phát hiện ra PID cho CMD. Nếu quá trình đã / đang ở một thiết bị đầu cuối khác, đầu ra ps cho mọi thứ thông qua grep để lọc cho lệnh của bạn sẽ giúp bạn tìm thấy nóps -elf | grep <command_related_word>
TafT

Kiểm tra tốt hơn câu trả lời của tôi dựa trên quy trìnhpgrep aka grep ...
Gilles Quenot

Làm thế nào tôi có thể đặt lệnh này vào nền?
DerWeh

1
@DerWeh Gói nó trong một tập lệnh shell và làm theo các bước được đưa ra ở đây: stackoverflow.com/q/625409/1025391
moooeeeep

3

Bạn có thể sử dụng các toán tử &&||toán tử để xâu chuỗi các lệnh lại với nhau. Ví dụ:

apt-get update && sleep 2 && init 0

sẽ thực hiện cập nhật hệ thống bằng aptitude, đợi 2 giây và chuyển sang runlevel 0, tùy thuộc vào hệ thống của bạn, điều này có thể thực sự tắt hoặc không tắt nguồn phần cứng.

Để nói chuyện với một hoặc nhiều thao tác sau một thao tác tùy ý hơn, chẳng hạn như trình duyệt web, có lẽ là tải xuống, bạn sẽ cần thêm logic để xem tệp tải xuống để xác minh rằng thực tế quá trình tải xuống đã hoàn tất.


3

Nếu bạn muốn theo dõi một quá trình đã bắt đầu, bạn có thể thực hiện việc này trong trình :

# while pgrep &>/dev/null -f process_name; do sleep 60; done; shutdown -h now

1

Có một ứng dụng, được đặt tên là sentinella có thể làm điều đó cho bạn với GUI của nó: sentinella

để cài đặt nó:

sudo aptitude update
sudo aptitude install sentinella
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.