Làm cách nào tôi có thể thêm vào quy trình đang chạy một lệnh 'tắt máy' bổ sung?


11

Một cách thường xuyên, tôi quên không thêm && shutdown -h nowvào một quy trình dài. Có cách nào để thêm một shutdown -h nowlệnh sau khi lệnh đầu tiên được gọi không? Nó không có ý định làm gián đoạn quá trình đang diễn ra. Có lẽ có thể xem PID?


Tôi hy vọng bạn nhận ra rằng bất cứ điều gì đến sau &&sẽ chỉ chạy nếu lệnh trước đó thành công. Nếu bạn muốn nó chạy ngay cả khi lệnh không sử dụng ;thay thế.
Zoke

Câu trả lời:


13

Không cần phải chạy liên tục ps để liệt kê tất cả các quy trình và grep thông qua đầu ra. Bối cảnh quá trình với ctrl-Z, sau đó chạy

bg %1 ; wait %1 ; shutdown -h now

Nếu bạn có các công việc nền khác đang chạy, thì bạn sẽ được cung cấp một công việc khác thay vì [1] khi bạn ctrl-z. Nếu vậy, sử dụng thay thế.


3

Bạn có thể làm một cái gì đó như thế này, điều này sẽ kiểm tra xem quá trình có chạy 5 giây một lần hay không và thực hiện hành động thích hợp:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Lưu ý dấu ngoặc vuông trong grepbiểu thức. Điều này là để đảm bảo rằng grepquy trình không được khớp nếu nó kết thúc trong psdanh sách. Bao quanh bất kỳ ký tự đơn với dấu ngoặc vuông là đủ.


+1 kể từ khi nó hoạt động. Không phải là cách tôi sẽ làm nó tho.
Zoke

@Zoke: Nếu có cách khác, tôi sẽ quan tâm.
Scott Severance

Đăng một câu trả lời là tốt. Kiểm tra nó nếu bạn thích.
Zoke

Bạn cũng có thể sử dụng kill -0 (pid) để kiểm tra sự tồn tại của một quá trình mà không giết nó.
lông mịn

3

Tôi làm điều này tất cả các thời gian.

  1. Bắt đầu quá trình.
  2. Nhận ra rằng tôi quên làm &&lệnh của tôi .
  3. Nhấn Ctrl+ Zđể tạm dừng quá trình và quay lại trình bao.
  4. Chạy fg && shutdown -h nowđến:
    1. Mở đầu và tiếp tục quá trình bạn vừa bị đình chỉ.
    2. Sau đó, sau khi kết thúc, nó sẽ chạy những gì bạn muốn chạy.

Ngoài ra, bạn có thể thăm dò ý kiến ​​trong các câu trả lời khác như thế này:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now

Điều đó sẽ tắt ngay lập tức.
psusi

Các fg hoàn thành ngay lập tức, vì vậy ...
psusi

@psusi no it won
Walking Wiki

@WalkingWiki, ôi lạ quá, bạn nói đúng. Tôi thề tôi đã thử nghiệm điều này vào năm 2012 và nó đã hoàn thành ngay lập tức.
psusi

1

Nếu bạn biết pid bạn có thể chạy này:

while ps -p $PID; sleep 5; done; shutdown -h now

Để chạy mà không có tiếng vang từ ps, hãy làm điều này:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

Và cuối cùng để chạy nó trong nền mà không có bất kỳ đầu ra nào:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

Giải pháp của Scott là một giải pháp tốt nhưng điều này sẽ loại bỏ sự cần thiết greplặp đi lặp lại nếu bạn đã biết về vấn đề này. Và nó nhanh hơn rất nhiều để nhập vào .: P


0

Tạo một kịch bản shell để chạy cả hai quá trình:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

Sau khi lưu cái này trong thư mục nơi bạn bắt đầu quá trình đã cho, hãy thực hiện:

chmod +x MyShellScript.txt

Sau đó, khi bạn muốn chạy lệnh, chỉ cần gõ ./MyShellScript.txtvà nó sẽ làm cả hai cho bạn.

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.