Bagaimana cara mendapatkan status proses keluar dari sesi shell lain?

7

Misalkan saya menjalankan perintah dalam satu sesi shell, misalnya bash -c 'apt-get update && apt-get upgrade'. 5 menit kemudian saya memutuskan untuk pergi keluar untuk camilan, dan menyadari bahwa saya lupa menambahkan beberapa bentuk mekanisme pemberitahuan apakah keluar itu berhasil atau gagal.

Nah, apa yang harus saya lakukan sekarang? Kalau saja saya bisa menanyakan dari terminal lain status keluar dari perintah lain itu (atau secara khusus, PID itu), mungkin saya bisa setelah semua menampilkan semacam pop up. Jadi pertanyaannya adalah: bagaimana saya bisa menanyakan status keluar dari proses yang sudah berjalan dari terminal lain?

Dengan kata lain,

DIBERIKAN bahwa saya memiliki proses yang berjalan di terminal A DAN PID-nya diketahui

KAPAN saya menjalankan beberapa perintah di terminal B

MAKA saya harus bisa tahu apakah proses di terminal A selesai dengan status keluar 0 atau status keluar> 1.

Sergiy Kolodyazhnyy
sumber
Jadi Anda ingin sesuatu (perintah peringatan melaporkan kode keluar?) Untuk menjalankan setelah proses, ditentukan sewenang-wenang A (diberikan PID) berakhir, setelah melampirkan "pengamat" padanya dengan perintah B? Kami tidak dapat berasumsi bahwa A adalah pekerjaan latar belakang yang berjalan di shell yang sama di mana Anda kemudian mengetik B, bukan?
Byte Commander
@ByteCommander Benar. Itu pekerjaan latar depan.
Sergiy Kolodyazhnyy
Saya rasa tidak mungkin mendapatkan kode pengembalian dari anak dari shell yang berbeda. Anda dapat menggunakan waituntuk mendapatkan kode proses latar belakang di shell Anda saat ini, setelah itu berakhir, tapi saya tidak bisa menemukan apa pun yang memungkinkan untuk meminta shell lain. Cukup memantau apakah suatu proses masih berjalan dan meningkatkan peringatan setelah keluar juga sepele lagi, tetapi tidak mengetahui kode keluarnya. Satu-satunya cara saya mungkin memikirkan akan memerlukan mempersiapkan shell Anda PROMPT_COMMANDuntuk menyimpan kode keluar terakhir di tempfile atau lokasi yang dapat diakses serupa. Apakah itu pilihan?
Byte Commander
@ByteCommander Tidak. Tidak mempersiapkan terminal A, lakukan segalanya dari terminal B. Dan percayalah, itu mungkin.
Sergiy Kolodyazhnyy
1
Yah, itu akan menjadi persiapan permanen (mengedit. Bashrc sekali), tapi oke. Menantikan untuk membaca jawabannya, jika Anda menemukannya.
Byte Commander

Jawaban:

8

Gunakan stracesebagai berikut:

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

Tidak ada panggilan sistem atau sinyal yang menarik di sini, jadi kami katakan straceuntuk mengabaikannya dengan -eekspresi dan menekan pesan status -q. stracemenempel pada proses dengan PID $PID, menunggu sampai keluar secara normal dan mengeluarkan status keluarnya seperti ini:

+++ exited with 0 +++

ifEkspresi sederhana untuk memanggil semua jenis notifikasi dapat berupa:

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

Contoh dijalankan

# 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

Sebagian besar kredit diberikan untuk jawaban ini pada U&L , silakan tinggalkan upvote di sana jika Anda merasa ini berguna.

pencuci mulut
sumber