Pada baris perintah, saya mengetik perintah dan tekan enter. Itu tidak menghasilkan apa-apa. Bagaimana saya tahu apakah itu berjalan dan belum menghasilkan, atau meminta input pengguna?
command-line
process
io
Gqqnbig
sumber
sumber
PS1
prompt.cat
perintah. Cukup ketikcat
sendiri dan akan menunggu input dari stdin, tetapi tidak memberikan prompt. Banyak perintah lain berperilaku serupa karena mereka mengharapkan input baik dari stdin atau file, tetapi tidak membedakan antara sumber input yang berbeda (terminal interaktif, pipa, file ...).Jawaban:
Ada beberapa pendekatan:
Coba beri tanda akhir input : Tanpa hak superuser, sulit untuk mengetahui apa yang terjadi di balik tudung. Yang bisa dilakukan adalah menekan Ctrl+ d. Terminal dan utilitas dalam mode kanonik mengirim semua teks yang tersedia ke
read()
syscall setelah menerima sinyal EOT terikat pada kombinasi tombol ini, dan jika tidak ada input -read()
mengembalikan status keluar negatif yang sebagian besar utilitas menerima sebagai sinyal untuk keluar. Oleh karena itu, jika sebuah utilitas menunggu input, ia akan keluar setelah menerima kombinasi tombol. Jika tidak, utilitas dapat menjalankan tugas atau tidak ditulis dengan benar.Memata-matai syscalls : Jika Anda memiliki hak pengguna super, Anda dapat menjalankan
strace
di terminal lain untuk melihat apa yang sedang dilakukan. Untuk itu Anda perlu mengetahui PID dari program tersebut. Misalnya, dalam tab terminal lainpgrep -f firefox
yang menjalankan 1234 sebagai contoh lalusudo strace -f -p 1234
. Jika output yang Anda lihat macet diread()
syscall, itu berarti perintah mungkin sedang menunggu input. Jika tidak, jika Anda melihat syscalls berjalan, maka perintah melakukan sesuatu yang lain. Lihat pertanyaan terkait untuk penggunaanstrace
untuk juga mencari tahu apakah perintah lama telah keluar.Gunakan metode perintah sendiri : Antara lain, utilitas seperti
dd
sinyal penggunaan. Misalnya, jika Anda menggunakankill -USR1 1234
(di mana 1234 adalah PID daridd
perintah yang sedang berjalan ), itu akan mencetak untuk stdout jumlah byte yang sedang diproses. Tentu saja, ini membutuhkan pengetahuan tentang perilaku perintah seperti itu di tempat pertama. Dua metode di atas lebih umum, dan tidak memerlukan pengetahuan mendalam tentang perilaku masing-masing perintah (meskipun itu selalu terbaik untuk mengetahui apa yang sebenarnya Anda jalankan - jika tidak, Anda berisiko menjalankan perintah yang dapat merusak).sumber
strace
metodenya :-) Tetapi metode yang lebih sederhana juga berguna (umum atau spesifik untuk setiap program). Beberapa dari mereka bekerja tanpa hak pengguna super. Contoh: periksa apakahdd
melakukan sesuatu dan periksa mengapagrep --color asdf
menunggu diam-diam.dd
saya akan menambahkan yang itu.Bagaimana cara mengetahui apakah suatu program sedang berjalan atau menginginkan input pengguna
Itu tergantung pada program dan bagaimana Anda memintanya.
Seringkali tetapi tidak selalu akan ada prompt, yang menunjukkan bahwa program meminta masukan.
Jika Anda tidak yakin, Anda dapat memeriksa apakah proses program sedang sibuk
menggunakan CPU - use
top
atauhtop
membaca atau menulis - gunakan
sudo iotop -o
Dan ketika program telah selesai, Anda akan melihat prompt shell.
Shellscript
running
Saya memiliki shellscript yang memeriksa apakah suatu program sedang berjalan, dan sekarang saya telah menambahkan opsi
-s
untuk membuatnya berjalansudo strace -f -p <PID>
(sesuai dengan jawaban Sergiy Kolodyazhnyy) ketika sebuah ... ditemukan.Shellscript menggunakan
ps -ef
untuk menemukan sebagian besar programsystemctl is-active --quiet
untuk menemukan beberapa programdan jika Anda ingin
strace
dixterm
jendela.Instal
xterm
jika Anda ingin menggunakanstrace
untuk menonton aktivitas suatu program.Pemakaian
Anda dapat menginstal shellscript
running
ke direktoriPATH
jika Anda ingin akses mudah ke sana.Kode shellscript
Demo
Memeriksa terminal windows di Lubuntu (LXTerminal dimulai sebagai
x-terminal-emulator
dan customgnome-terminal
windows),Ada banyak aktivitas segera setelah kursor berada di jendela terminal.
Mulai
grep
(menunggu input dari/dev/stdin
)Memeriksanya
Tidak banyak kegiatan, dan Anda dapat mengidentifikasi apa yang terjadi.
sumber
iotop
, meskipun penggunaan CPU mungkin tidak selalu menjadi indikator jika suatu proses sedang sibuk. Program yang ditulis dalam C dan dioptimalkan mungkin menggunakan CPU minimal. Beberapa indikator yang saya tulis dengan Python menjadwalkan tugas yang berulang untuk dijalankan, jadi mungkin menggunakan CPU untuk memperbarui menu indikator untuk sesaat dan kemudian hanya duduk di sana.strace
metode adalah lebih baik, tapi mungkin tidak diperlukan atau tidak tersedia.Tidak yakin apakah Anda masih membutuhkan ini, tetapi masih ada trik yang berguna untuk diketahui: jika program tampaknya keluar tanpa output apa pun, Anda dapat memeriksa apakah program berjalan di latar belakang dengan menjalankan
Bersulang!
sumber
Jika Anda menjalankan shell di terminal, misalnya emulator terminal atau sesi ssh biasa, shell Anda hampir pasti telah mengaktifkan kontrol pekerjaan. Ini membuat mendapatkan jawaban untuk pertanyaan Anda sangat mudah dalam banyak kasus.
Ketik Ctrl+Zuntuk menunda proses dan kemudian
bg
melanjutkannya di latar belakang, kemudian ketik baris kosong ke shell sehingga akan memeriksa apakah program dihentikan oleh sinyal.Jika proses mencoba membaca dari terminal, ia akan segera mendapatkan
SIGTTIN
sinyal dan akan ditangguhkan. (Ketika kontrol pekerjaan diaktifkan, sistem hanya memungkinkan satu proses pada satu waktu untuk membaca dari terminal.) Shell akan melaporkan ini. Anda kemudian dapat mengetikfg
untuk melanjutkan proses di latar depan, dan kemudian ketik input untuk dibaca oleh program seperti biasa.Beberapa program, seperti editor, akan menjebak atau mengabaikan sinyal yang dihasilkan oleh Ctrl+Zatau menempatkan terminal ke mode di mana karakter kontrol bahkan tidak menghasilkan sinyal. Anda harus menggunakan teknik yang lebih maju dalam hal ini, seperti menggunakan
strace
untuk melihat apakah proses yang dilakukanread
,select
,poll
, dllsumber