GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mendapatkan Informasi Lebih Lanjut Tentang Asal Usul Kode Keluar?

Terkadang saya perlu memelihara program yang menjalankan skrip shell yang memanggil program dan skrip lain. Oleh karena itu, ketika skrip shell utama diakhiri dengan kode keluar 126, sulit untuk mengetahui skrip dan perintah yang dipanggil yang mengatur kode keluar tersebut.

Apakah ada cara untuk melihat perintah mana yang menjadi alasan kode keluar agar lebih mudah untuk memeriksa izinnya?

Jawaban yang Diterima:

Jika di Linux, Anda dapat menjalankan perintah di bawah strace -fe process untuk mengetahui proses mana yang melakukan exit_group(126) dan perintah apa (atau induknya jika tidak menjalankan apa pun sendiri) yang dieksekusi terakhir sebelum melakukan itu:

$ strace -fe process sh -c 'env sh -c /; exit'
execve("/bin/sh", ["sh", "-c", "env sh -c /; exit"], [/* 53 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f24713b1700) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f24713b19d0) = 26325
strace: Process 26325 attached
[pid 26324] wait4(-1,  <unfinished ...>
[pid 26325] execve("/usr/bin/env", ["env", "sh", "-c", "/"], [/* 53 vars */]) = 0
[pid 26325] arch_prctl(ARCH_SET_FS, 0x7fbdb4e2c700) = 0
[pid 26325] execve("/bin/sh", ["sh", "-c", "/"], [/* 53 vars */]) = 0
[pid 26325] arch_prctl(ARCH_SET_FS, 0x7fef90b3b700) = 0
[pid 26325] clone(strace: Process 26326 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fef90b3b9d0) = 26326
[pid 26325] wait4(-1,  <unfinished ...>
[pid 26326] execve("/", ["/"], [/* 53 vars */]) = -1 EACCES (Permission denied)
sh: 1: /: Permission denied
[pid 26326] exit_group(126)             = ?
[pid 26326] +++ exited with 126 +++
[pid 26325] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 126}], 0, NULL) = 26326
[pid 26325] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=26326, si_uid=10031, si_status=126, si_utime=0, si_stime=0} ---
[pid 26325] exit_group(126)             = ?
[pid 26325] +++ exited with 126 +++
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 126}], 0, NULL) = 26325
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=26325, si_uid=10031, si_status=126, si_utime=0, si_stime=0} ---
exit_group(126)                         = ?
+++ exited with 126 +++

Di atas, itu adalah proses 26326 yang pertama keluar dengan 126, itu karena mencoba mengeksekusi / . Itu adalah anak dari proses 26325 yang terakhir dieksekusi sh -c / .

Jika skrip tersebut adalah bash skrip atau jika mereka sh skrip dan sh kebetulan bash di sistem Anda, Anda dapat melakukan:

$ env SHELLOPTS=xtrace 
      BASH_XTRACEFD=7 7>&2 
      PS4='[$?][$BASHPID|${BASH_SOURCE:-$BASH_EXECUTION_STRING}|$LINENO]+ '  
    sh -c 'env sh -c /; exit'
[0][30625|env sh -c /; exit|0]+ env sh -c /
[0][30626|/|0]+ /
sh: /: Is a directory
[126][30625|env sh -c /; exit|0]+ exit

Itu tidak memberi tahu kami secara tepat proses apa yang keluar dengan 126 tetapi bisa memberi Anda petunjuk yang cukup.

Terkait:Bagaimana cara mengganti nama banyak file menggunakan find?

Kami menggunakan BASH_TRACEFD=7 7>&2 sehingga jejak ditampilkan pada asli stderr, bahkan ketika stderr dialihkan dalam skrip. Jika tidak, pesan jejak tersebut dapat memengaruhi perilaku skrip jika mereka melakukan hal-hal seperti (....) 2>&1 | ... . Itu mengasumsikan skrip tersebut tidak secara eksplisit menggunakan atau menutup fd 7 sendiri (itu tidak mungkin, jauh lebih tidak mungkin daripada mengarahkan ulang stderr).


Linux
  1. Bagaimana Cara Mencari Kode Keluar Untuk Aplikasi?

  2. Bagaimana Cara Mendapatkan Kunci Usb Untuk Pemasangan Otomatis?

  3. Cara Mendapatkan Informasi Tentang Kontainer Di Docker

  1. Cara mendapatkan ukuran file tar.gz dalam (MB) dengan python

  2. Bagaimana cara mendapatkan nama pengguna di Makefile?

  3. Bagaimana cara mendapatkan PYTHONPATH di shell?

  1. Bagaimana cara mendapatkan ID proses untuk mematikan proses nohup?

  2. Bagaimana saya bisa mendapatkan informasi wadah Docker Linux dari dalam wadah itu sendiri?

  3. Bagaimana menemukan informasi tentang RAM?