Làm thế nào để thực thi lệnh sau khi chạy lệnh hiện tại trong bash?


18

Tôi đang tải xuống tệp với wget và tôi muốn tắt máy tính của mình sau khi tải xuống sẽ hoàn tất, nhưng tôi cần phải đi đâu đó ngay bây giờ :) Có thể thực thi lệnh trong bash exacly khi quá trình hoàn tất không?

Tôi biết rằng điều này hoạt động:

wget http://example.com/file.rar; tắt máy ngay

Nhưng nếu tôi chỉ gõ:

wget http://example.com/file.rar

2
Cân nhắc sử dụng && và || thay vì ;. && và || kiểm tra giá trị trả về của lệnh trước đó trước khi thực hiện lệnh tiếp theo ... chỉ trong trường hợp wget không thành công, bạn có thể không muốn tắt máy.
KFro

Câu trả lời:


31

Bạn có thể làm một cái gì đó như thế này:

  1. dừng thực thi wget với ctrl-z (nó không dừng lại, nó bị treo)
  2. đặt nó vào nền (bg)
  3. chạy: chờ đợi; tắt máy -h ngay

chờ đợi sẽ chờ cho tất cả các chương trình chạy trong nền từ shell hiện tại - tức là wget này.

Sau khi chờ đợi sẽ kết thúc - tắt máy sẽ tiếp tục.


đừng quên foreground (fg) ví dụ wget của bạn khi hoàn tất. Nếu wget đã chạy, bạn có thể đặt nó vào nền trước với ^ z (control-z).
Andrew Scagnelli

4
Không cần trừ khi bạn thực sự muốn xem thanh tiến trình.
dmckee

Không cần vì anh ta để máy tự tắt rồi tắt máy.
Sói

11

Trong một vỏ khác, sử dụng

ps -u <your username> | grep wget

để tìm ra lệnh PID mà bạn muốn đợi, sau đó

wait <PID>; shutdown -h now

do đó tắt máy sẽ không chạy cho đến khi quá trình kết thúc. Xem thêm câu trả lời của depesz .


+1, chỉ là một lưu ý: waitsẽ chỉ hoạt động đối với các lệnh được bắt đầu từ cùng một vỏ
Chriki

4

Giải pháp của tôi là thế này: tạm dừng tác vụ dài hạn của bạn với Control + Z, sau đó nhập nội dung như:

fg; echo "Done!"

Nếu bạn muốn chạy phản ứng khác nhau dựa trên thành công hay thất bại của lệnh, hãy sử dụng && và || như các nhà khai thác ngắn mạch.

fg && echo "Success!" || echo "Failure!"

EDIT: Điều này sẽ không hoạt động với sudo, vì nó sẽ hỏi mật khẩu của bạn. Tôi đã, theo đó, loại bỏ các ví dụ bằng sudo. Nếu bạn cần sudo cho nhiệm vụ thứ hai, hãy sử dụng một trong các phương thức được đăng ở đây.

Mặt khác, tôi tin rằng cả Gnome và KDE đều cung cấp các cách để kích hoạt tắt / khởi động lại mà không sử dụng sudo, bằng cách gửi tín hiệu D-Bus thích hợp hoặc một cái gì đó.


+1 cho fg..., nhưng sudocó thể là một vấn đề nếu nó nhắc bạn nhập mật khẩu
mark4o

Hừm. Có, tôi đã không sử dụng thủ thuật này để sudo mọi thứ khi một cái gì đó kết thúc. Đối với sudo, bạn cần một thủ thuật khác. Tôi sẽ chỉnh sửa bài viết của tôi cho phù hợp.
Ryan C. Thompson

Với mục đích của tôi, câu trả lời này là vượt trội vì nó đặt quá trình tự động trở lại nền trước
Cookie

Ngoài ra, mật khẩu cho sudo có thể bị vô hiệu hóa (mỗi người dùng và mỗi lệnh) - nếu người dùng được phép tắt thông qua sudo này một lần, anh ta có thể được phép làm như vậy luôn. Tắt máy thù địch có thể không nguy hiểm trong một số trường hợp - chắc chắn không nguy hiểm như truy cập của khách bị xâm phạm trên máy đang chạy.
Cookie

1

Có, chỉ cần gõ lệnh thứ hai của bạn và nhấn enter. Nếu chương trình hiện tại của bạn đang cuộn văn bản, bạn không thể thấy những gì bạn đang gõ chính xác, vì vậy hãy xem các phím của bạn để bạn làm đúng.

Một cách thông minh hơn là chuyển sang TTY khác (CTRL + ALT + F1 đến F6) và chạy lệnh đồng thời hoặc nếu bạn đang sử dụng chương trình dòng lệnh như màn hình, bạn có thể tạo một cửa sổ mới trong đó.


+1 cho tùy chọn đầu tiên. Tôi sợ rằng tôi không hiểu làm thế nào tùy chọn thứ hai được cho là hoạt động.
innaM

Nhấn ví dụ CTRL + ALT + F2 sẽ chuyển bạn sang bàn điều khiển thứ hai mới nơi bạn có thể đăng nhập và nhập lệnh, theo cách này bạn có thể chạy lệnh thứ hai ở đó. Thứ hai, nếu bạn tải xuống màn hình (một chương trình sử dụng bảng điều khiển của bạn theo cách lạ mắt hơn), bạn có thể mở tab / cửa sổ thứ hai nơi bạn có thể nhập lại lệnh mà không cần phải đăng nhập lại. Nhưng khi bạn cần nó đồng thời, bạn có thể ở lại với tùy chọn 1, tôi không nghĩ có một cách khác để đạt được hiệu quả tương tự. Trừ khi bạn sử dụng một TTY / cửa sổ khác để kiểm tra tập lệnh nếu quá trình vẫn đang chạy. :-P
Tamara Wijsman

Sử dụng PID chờ từ câu trả lời của dmckee
Cookie

1

Nếu bạn muốn nhận được sự ưa thích, hãy kiểm tra trạng thái trở lại của wget và chỉ tắt máy nếu nó thành công.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi

2
Đây là một cách tiếp cận tốt khi viết kịch bản, nhưng trong khi wgetchạy, bạn không nhận được lời nhắc để xây dựng bài kiểm tra.
dmckee

Bạn có thể kết hợp điều này với thủ thuật Control-Z và fg của tôi để khắc phục điều đó.
Ryan C. Thompson
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.