Bagaimana cara melihat perintah dieksekusi di shell lain?

9

Apakah ada cara untuk menonton perintah apa yang sedang dieksekusi di shell lain, saat dieksekusi? Kedua shell adalah bash, dan saya memiliki akses root, jika itu penting. Saya tidak dapat menginstal perangkat lunak tambahan, dan saya tidak ingin shell lain harus melakukan sesuatu yang istimewa seperti menjalankan layar.

Situasi: Saya jauh login ke mesin Linux, dan begitu juga rekan kerja. Saya ingin melihat perintah yang dia jalankan di cangkangnya. Saya tahu bahwa saya bisa menggunakan beberapa kombinasi watchdan psuntuk melihat perintah yang membutuhkan waktu lebih dari satu detik untuk dijalankan, tetapi saya tidak percaya itu akan membantu dengan perintah yang sangat singkat.

Tom Panning
sumber
5
perintah builtin seperti kill, dan cdjangan menelurkan sub-proses dan tidak akan pernah muncul dalam output ps.
jordanm
@jordanm Terima kasih, itu poin yang bagus. Bahkan hanya dengan perintah yang menyebabkan fork / exec, itu mungkin akan cukup baik.
Tom Panning

Jawaban:

7

Karena Anda root, Anda selalu bisa strace -f -e execve -p her_bash_pid. Hal -fini diperlukan karena cangkangnya akan melakukan proses baru sebelum proses exec, tetapi ini juga berarti Anda akan melihat apa saja yang dijalankan oleh proses anak.

Jim Paris
sumber
Terima kasih, menangkap keluaran strace untuk exec membuatnya cukup mudah dibaca. Saya yakin fakta bahwa hal itu terus mengikuti anak-anak anak-anak akan membingungkan saya suatu hari nanti, tetapi untuk sekarang saya pikir saya akan aman. Sayang sekali tidak ada cara untuk secara otomatis melepaskan diri dari suatu proses setelah itu memanggil exec.
Tom Panning
Ini open source; Anda selalu dapat menambahkan fitur itu jika Anda benar-benar membutuhkannya. :) Atau tambahkan skrip yang sedikit lebih cerdas untuk menguraikan output strace yang mengabaikan PID begitu itu exec.
Jim Paris
5

Jika rekan kerja Anda dapat mengubah beberapa pengaturan riwayat untuk bash shell mereka, maka Anda bisa mendapatkan informasi ini dari tail -f /home/user/.bash_history. Berikut adalah pengaturan yang Anda perlukan untuk .bash_history ditulis setelah setiap perintah, bukan pada saat shell keluar:

export PROMPT_COMMAND="history -a"
shopt -s histappend

Saya akan menganggap sesi layar sebagai solusi "ideal".

jordanm
sumber
5

Setelah riset cepat (dan beberapa pemikiran) saya bisa memberi Anda daftar opsi yang memungkinkan:

  • baca bash_history-nya. Tetapi biasanya hanya ditulis pada saat logout. askubuntu.com memiliki posting tentang mengubah perilaku itu ( sunting : @jordanm rupanya memiliki ide yang sama dan lebih cepat memposting ...).
  • Jika dia menggunakan terminal fisik (/ dev / ttyX), Anda dapat menggunakan program ini conspy.
  • Manfaatkan dia screen. Jika Anda hanya ingin membantu dan tidak memata-matai dia, ia mungkin bersedia menjalankan sesi di dalam layar. Anda kemudian dapat dengan mudah melampirkan ke sesi dengansudo -u herUsername screen -x
  • Anda bisa menulis skrip pembungkus shell yang mencatat perintah ke logfile pilihan Anda. Anda harus mengatur shell-nya ke skrip itu (Ini hanya sebuah ide, mungkin atau mungkin tidak berfungsi).
  • Menggunakan cat /dev/pts/X | tee /dev/pts/Xadalah hal pertama yang terlintas di pikiran saya. Tetapi setelah mencoba tidak benar-benar bekerja dan merupakan solusi yang sangat kotor. Setiap karakter hanya dicetak ke salah satu terminal terlampir (yang merupakan alasan untuk memanggil teejuga). Ketika mencobanya saya bisa memata-matai setiap karakter kedua. Dengan sedikit imajinasi Anda bisa menebak apa yang dia lakukan ...
mreithub
sumber
salah: conspy tidak bekerja dengan ttys
Zibri
3

Layar GNU adalah IMO pujian terbaik sejauh ini. Jika layar GNU (atau tmux) tidak tersedia, mintalah rekan kerja Anda menjalankan script -f.

Dan kemudian Anda bisa menyaksikan apa yang dia lakukan dengan melakukan tail -fn +0 /path/to/typescript.

Stéphane Chazelas
sumber
0

Untuk berbagi terminal layar Unix, sehingga Anda dapat melihat input dan output rekan kerja Anda secara real-time, gunakan screenperintah Unix .

  1. Anda dan rekan kerja masuk sebagai pengguna Unix yang sama di ssh
  2. Anda mengetikkan perintah

    screen -d -m -S myscreenname

    screen -x myscreenname

    (Tentu saja ganti myscreenname dengan apa pun yang Anda inginkan nama layar menjadi).

  3. Rekan kerja mengetik perintah

    screen -x myscreenname

  4. Untuk menyelesaikan dengan berbagi terminal Unix Anda, orang dapat mengetikkan perintah

    exit

Fitur luar biasa dari layar adalah Anda dapat mengetik perintah dari terminal Unix dan rekan kerja dapat melihat output di layarnya. Ini adalah cara terbaik untuk melakukan administrasi pasangan dan mentor admin Unix junior.

Jirawat Uttayaya
sumber
0

Untuk menyelesaikan jawaban @ jordanm ... jika Anda berdua menggunakan akun pengguna yang sama, yaitu keluaran dari

echo $HOSTNAME
echo $USER 

sama untuk Anda dan rekan kerja Anda maka kami bisa bersenang-senang.

Kami dapat memungkinkan melihat perintah yang diminta di satu terminal agar tersedia secara instan di terminal lain

Jika Anda memanggil historyterminal Anda, Anda melihat perintah sebelumnya. Secara default, bash menulis sejarahnya di akhir setiap sesi ke a ~/.bash_history file, menimpa file yang ada dengan versi yang diperbarui. Ini berarti bahwa jika Anda login dengan beberapa sesi bash, hanya yang terakhir yang keluar akan menyimpan riwayatnya.

-------------------------------------------------- -----

Edit ~/.bashrcdan tambahkan ke dalamnya

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

dimana

history -aditambahkan ke ~/.bash_historyfile segera bukan pada akhir sesi

history -c membersihkan riwayat sesi saat ini

history -rmembaca ~/.bash_historyfile yang telah kami tambahkan, kembali ke riwayat sesi kami

Catatan: yang PROMPT_COMMANDparameter berisi perintah yang dieksekusi sebelum setiap perintah baru yang cepat. jadi command1 hanya akan disimpan ke histori ketika command2 dieksekusi

Anda mungkin juga ingin menampar stempel waktu di sebelah setiap perintah untuk kenyamanan saat melihat riwayat. Sekali lagi, edit ~/.bashrcdan tambahkan Anda

export HISTTIMEFORMAT="%d/%m/%y %T "

Juga peretasan yang bagus jika Anda ingin menggunakan banyak terminal dan ingin memiliki riwayat perintah Anda tersedia :)

Info lebih lanjut

saudara laki-laki
sumber