Saya telah meninggalkan skrip berjalan pada mesin jarak jauh dari ketika saya bekerja secara lokal di sana. Saya dapat terhubung melalui SSH ke mesin sebagai pengguna yang sama dan melihat skrip berjalan ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Ini hanya keluaran ke stdout pada sesi lokal (saya berlari ./ipchecker.sh
membentuk jendela terminal lokal, tidak ada redirection, tidak ada penggunaan screen
dll).
Adakah dari sesi SSH saya bisa melihat output dari perintah yang sedang berjalan ini (tanpa menghentikannya)?
Sejauh ini yang terbaik yang saya temukan adalah menggunakan strace -p 18386
tetapi saya mendapatkan gerombolan teks terbang di layar, terlalu rinci. Saya bisa berhenti strace
dan kemudian menyaring keluaran dan menemukan teks membawa dicetak ke stdout tetapi sangat panjang dan membingungkan, dan jelas sementara itu berhenti saya mungkin kehilangan sesuatu. Saya ingin menemukan cara untuk melihat output skrip hidup seolah-olah saya bekerja secara lokal.
Adakah yang bisa memperbaiki ini? Jawaban yang jelas adalah memulai kembali skrip dengan pengalihan atau dalam screen
sesi dll, ini bukan skrip misi kritis sehingga saya bisa melakukannya. Namun, saya melihat ini sebagai latihan belajar yang menyenangkan.
sumber
strace -p 4232 -e write
Jawaban:
Jika semua yang ingin Anda lakukan adalah memata-matai proses yang ada, Anda dapat menggunakan di
strace -p1234 -s9999 -e write
mana 1234 adalah ID proses. (-s9999
menghindari string terpotong menjadi 32 karakter, danwrite
system call yang menghasilkan output.) Jika Anda hanya ingin melihat data yang ditulis pada deskriptor file tertentu, Anda dapat menggunakan sesuatu sepertistrace -p1234 -e trace= -e write=3
hanya melihat data yang ditulis ke deskriptor file 3 (-e trace=
mencegah sistem panggilan agar tidak dicatat). Itu tidak akan memberi Anda output yang sudah diproduksi.Jika hasilnya terlalu cepat, Anda dapat
less
mengirimnya ke pager seperti , atau mengirimnya ke filestrace -o trace.log …
.Dengan banyak program, Anda dapat mengalihkan output berikutnya dengan hack ptrace, baik ke terminal Anda saat ini atau ke sesi layar baru. Lihat Bagaimana saya bisa menolak proses yang sedang berjalan dan menghubungkannya dengan shell layar baru? dan utas terkait lainnya.
Perhatikan bahwa tergantung pada bagaimana sistem Anda diatur, Anda mungkin perlu menjalankan semua
strace
perintah ini sebagai root bahkan jika proses berjalan di bawah pengguna Anda tanpa hak istimewa tambahan. (Jika proses berjalan sebagai pengguna yang berbeda atau setuid atau setgid, Anda harus menjalankannyastrace
sebagai root.) Sebagian besar distribusi hanya memungkinkan proses untuk melacak anak-anaknya (ini memberikan manfaat keamanan moderat - ini mencegah beberapa injeksi malware langsung, tetapi tidak mencegah injeksi tidak langsung dengan memodifikasi file). Ini dikendalikan olehkernel.yama.ptrace_scome
sysctl.sumber
man strace
Anda dapat mengakses output melalui sistem
proc
file.1
= stdout,2
= stderrsumber
/dev/null
) - itu hanya akan berfungsi jika output diarahkan ke file.ping google.es
dan yang lain sebagai root:tail -f /proc/`pgrep ping`/fd/2
dan tidak ada yang ditampilkan.Dalam BSD, Anda dapat menggunakan
watch
pengintai yang diberikan, misalnyaDi Linux, itu tidak akan mungkin jika proses tidak berjalan di bawah multiplexer sebelumnya seperti
screen
atautmux
. Lihat juga: Reptyr: Lampirkan Proses Berjalan ke Terminal BaruTampaknya satu-satunya cara adalah untuk debug proses (misalnya
strace
,dtrace
/dtruss
,gdb
,lldb
, dll).Karena Anda telah menggunakan
strace
, untuk mengambil output yang berarti, Anda perlu memfilter dengan ekspresi yang memenuhi syarat (sepertifile
), lalu parsing output. Berikut ini contohnya:Apa yang dilakukannya mencetak operasi tulis dari proses (panjang 1000) yang ditentukan oleh PID (digunakan
pgrep
untuk menemukannya berdasarkan nama), mengarahkan ulang kesalahan standar menjadi output (untuk difilter), dan mencetak string yang dikutip ganda.Jika Anda berurusan dengan output biner, Anda dapat mengurai karakter urutan sekuens dengan menggunakan
read
(with-r
) danprintf
(with%b
), misalnyaPeriksa
help read
lebih banyak parameter (misalnya-n
untuk mencetak setelah sejumlah karakter, daripada baris baru).Berikut ini contoh yang lebih lengkap:
Untuk contoh yang menggunakan proses apa pun, harap periksa: Bagaimana cara mengurai strace in shell ke teks biasa? di stackoverflow
sumber
Anda mungkin dapat mengintip layar jauh menggunakan
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
tempatlocalhost
yang akan diganti oleh kredensial login server jarak jauh Anda dan:0.0
dengan nomor tampilan GUI Anda.Gunakan
x11vnc
, yang merupakan server VNC untuk sesi X layar Anda.Saat menjalankan pada salah satu dari 6 konsol virtual coba
sudo setterm -dump 2 -file /dev/stdout
, di mana Anda ganti2
dengan vc yang sesuai.sumber
Saya akan menyarankan untuk membuat pipa bernama (
mkfifo
) dan kemudian menulis ke file itu. Kemudian, bacalah darinya. Anda selalu dapat melakukannya dengan hal-hal sepertitail
, untuk meminimalkan output, dll. Setiap kali Anda membersihkan pipa (baca darinya), itu akan dihapus, sehingga output tidak dipertahankan.Pilihan lainnya adalah menulis semuanya ke file (seperti logfile) dan kemudian menganalisanya kapan saja. Ini akan menjadi tindakan yang disukai, jika Anda ingin mempertahankan semua hasil.
sumber
Anda selalu dapat meluncurkan proses dengan nohup dan &
Kemudian, Anda dapat memeriksa progres dari tty manapun dengan:
Ini berfungsi baik untuk saya.
sumber
Cara yang sangat sederhana untuk mendapatkan output akan menangkap output Anda ke file dan tailing file itu.
JIKA LAKUKAN: ./ipcheck
BUKAN INSTEAD: ./ipcheck> [replacewithnamafileAnda]
Ini akan membuat file output di mana skrip Anda berada. Kemudian dari bash shell lain Anda cukup mengekor file:
tail [replacewithyourfilename] -f
sumber
setbuf(3)
) yang mungkin membuattail
masalah.Parsing output dari strace:
Saya menggunakan jawaban teratas (dengan ID proses saya 28.223) ...
Untuk menentukan bahwa saya peduli
write(9
. (Angka 9 digunakan di bawah, ini mungkin merupakan pegangan file dan mungkin berbeda untuk proses Anda.) Lalu saya menulis skrip Ruby cepat untuk menguraikan dan menampilkannya.Rekatkan yang berikut ke dalam
/usr/bin/parse_strace.rb
Jangan lupa
chmod a+x /usr/bin/parse_strace.rb
Saya memohon
strace -xx
(output hex, sehingga regex cocok dengan benar), pemipaan (termasuk STDERR) ke skrip saya dengan9
sebagai argumen pertama.Dan, voila, ini mengeluarkan STDOUT asli, baris baru, warna, dan semuanya!
sumber
Anda tidak bisa mendapatkan ID proses dan berkomunikasi dengannya dengan USR1,
yang mencetak PID skrip Anda, lalu menggunakannya untuk
Saya mengerti bahwa USR1 adalah sinyal "yang ditentukan pengguna", yang berarti bahwa siapa pun yang membuat program dapat menggunakannya untuk berarti "mematikan" atau "membuang log Anda" atau "mencetak foo seribu kali" atau apa pun.
sumber