Làm thế nào để có được trạng thái thoát quy trình từ phiên shell khác?


7

Giả sử tôi chạy một lệnh trong một phiên shell chẳng hạn bash -c 'apt-get update && apt-get upgrade'. 5 phút sau tôi quyết định ra ngoài ăn vặt, và nhận ra tôi đã quên thêm một số hình thức cơ chế thông báo cho dù thoát là thành công hay thất bại.

Chà, làm gì bây giờ? Nếu chỉ tôi có thể truy vấn từ một thiết bị đầu cuối khác trạng thái thoát của lệnh khác đó (hoặc cụ thể là PID đó), thì có lẽ sau tất cả tôi có thể hiển thị một số loại bật lên. Vì vậy, câu hỏi là: làm thế nào tôi có thể truy vấn trạng thái thoát của một quá trình đã chạy từ một thiết bị đầu cuối khác?

Nói cách khác,

GIVEN rằng tôi có một quy trình đang chạy trong thiết bị đầu cuối A VÀ PID của nó được biết đến

KHI tôi thực thi một số lệnh trong terminal B

THEN Tôi sẽ có thể biết nếu quá trình trong thiết bị đầu cuối A kết thúc với trạng thái thoát 0 hoặc trạng thái thoát> 1.


Vì vậy, bạn muốn một cái gì đó (một lệnh cảnh báo báo cáo mã thoát?) Chạy khi một quy trình A (tùy ý) được chỉ định chấm dứt, sau khi gắn "trình theo dõi" với nó bằng lệnh B? Chúng ta không thể cho rằng A là một công việc nền chạy trong cùng một vỏ mà sau này bạn gõ B, phải không?
Chỉ huy Byte

@ByteCommander Đúng. Đó là một công việc tiền cảnh.
Sergiy Kolodyazhnyy

Tôi không nghĩ có thể lấy mã trả về từ một đứa trẻ có vỏ khác. Bạn có thể sử dụng waitđể lấy mã của một quá trình nền trong trình bao hiện tại của mình, sau khi nó kết thúc, nhưng tôi không thể tìm thấy bất cứ điều gì cho phép truy vấn các trình bao khác. Đơn giản chỉ cần theo dõi xem một quy trình có còn chạy hay không và đưa ra cảnh báo một khi nó thoát cũng là chuyện nhỏ, nhưng không tìm ra mã thoát của nó. Cách duy nhất tôi có thể nghĩ là sẽ yêu cầu chuẩn bị vỏ của bạn PROMPT_COMMANDđể lưu mã thoát cuối cùng trong một tempfile hoặc vị trí có thể truy cập tương tự. Đó sẽ là một lựa chọn?
Chỉ huy Byte

@ByteCommander Không. Không chuẩn bị thiết bị đầu cuối A, làm mọi thứ từ thiết bị đầu cuối B. Và hãy tin tôi, điều đó là có thể.
Sergiy Kolodyazhnyy

1
Chà, nó sẽ là một sự chuẩn bị vĩnh viễn (chỉnh sửa .bashrc một lần), nhưng không sao. Mong được đọc câu trả lời, nếu bạn tìm thấy một.
Chỉ huy Byte

Câu trả lời:


8

Sử dụng stracenhư sau:

sudo strace -e trace=none -e signal=none -q -p $PID

Cả các cuộc gọi hệ thống và tín hiệu đều không được quan tâm ở đây, vì vậy chúng tôi bảo stracebỏ qua chúng bằng các -ebiểu thức và thay thế một thông báo trạng thái -q. stracegắn vào quy trình với PID $PID, đợi cho nó thoát bình thường và xuất ra trạng thái thoát như thế này:

+++ exited with 0 +++

Một ifbiểu thức đơn giản để gọi bất kỳ loại thông báo nào có thể là:

if sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
  echo yeah
else
  echo nope
fi

Chạy ví dụ

# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah

# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope

Hầu hết các khoản tín dụng cho câu trả lời này trên U & L , vui lòng để lại một upvote ở đó nếu bạn thấy điều này hữu ích.

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.