Bagaimana cara mengetahui perintah mana yang dieksekusi tanpa menghentikannya?

20

Dalam contoh saya, saya menjalankan perintah yang membutuhkan waktu sangat lama untuk dieksekusi (beberapa jam).

Saya tidak begitu ingat apakah saya memasukkan make atau make -j4.

Tentu saja saya bisa menghentikannya dan menekan tombol atau memeriksa riwayat untuk mengetahuinya, tapi itu akan menghentikan proses dan saya tidak ingin itu terjadi (kalau-kalau sudah melakukan make -j4).

Apakah ada cara untuk mengetahui perintah mana yang dieksekusi tanpa menghentikan proses?

Daniel Viaño
sumber
5
Dari terminal lain, cobapgrep -a make
John1024
2
Jika makeAnda bisa berhenti dan mulai ulang dan itu harus mengambil di mana ia tinggalkan.
user253751

Jawaban:

34

Jika Anda ingin melihat baris perintah penuh untuk setiap instance makeyang berjalan di komputer Anda, buka terminal baru dan coba:

pgrep -a make

pgrepadalah program yang mencari melalui semua proses di komputer Anda. Dalam hal ini, ia mencari program yang bernama make. Opsi -amemberi tahu pgrepuntuk mencantumkan ID proses dan baris perintah lengkap untuk setiap proses pencocokan. (Tanpa -a, itu hanya akan mengembalikan ID proses.) Untuk informasi lebih lanjut tentang banyak pilihan pgrep, lihat man pgrep.

John1024
sumber
7
Ini berguna untuk kasus sederhana seperti yang ada di pertanyaan. Namun jika perintah melibatkan pipeline, loop, urutan perintah, perintah internal, atau ekspansi variabel yang Anda temukan pgrepakan terlihat berbeda dari perintah yang diketik pada baris perintah.
kasperd
28

Saat jendela terminal aktif, Anda dapat menjeda (menangguhkan) proses dengan menekan Ctrl+ Z. Anda kemudian dapat mendorong pekerjaan di latar belakang dengan mengetik bg(pekerjaan Anda sekarang akan berlanjut di latar belakang dan pada saat yang sama Anda dapat bekerja di baris perintah; ini setara dengan memulai pekerjaan dengan &di akhir baris perintah). Kemudian gunakan panah-kursor (atas dan bawah) untuk melihat perintah mana yang Anda gunakan. Jika Anda ingin (tetapi ini tidak perlu) Anda bisa mendapatkan pekerjaan Anda ke latar depan dengan mengetik fg.

Stefan
sumber
7
Ini berfungsi dengan beberapa perintah tetapi tidak semua. Misalnya jika Anda mengetikkan loop seperti for X in {1..1000} ; do sleep $X ; donemaka loop akan terputus dan iterasi yang tersisa tidak akan terjadi.
kasperd
11
@kasperd Ya, cukup mengganggu jika Anda bertanya kepada saya, tapi saya menemukan solusi keren untuk masalah itu. Kelilingi perintah yang rumit seperti itu di dalam tanda kurung jadi itu adalah sebuah subkulit. Kemudian Ctrl-Z akan menangguhkan seluruh subkulit dan melanjutkan dengan benar.
penguin359
@kasperd Tidak di bash, tetapi mereka lakukan di zsh.
JoL
4
Tidak perlu menempatkan pekerjaan ke latar belakang: cukup untuk menangguhkannya, periksa riwayat (atau jobs, seperti yang ditunjukkan pada jawaban @ ichabod), dan kemudian melanjutkan melalui fg.
Konrad Rudolph
10

Saya melakukan sesuatu seperti Stefan: ^ Z untuk menghentikan pekerjaan, dan kemudian saya lari jobs. Jika Anda memiliki beberapa proses yang berjalan, Anda mungkin harus memilah pekerjaan mana yang Anda jeda, tetapi ini umumnya akan memberikan baris perintah. Kemudian jalankan fguntuk melanjutkan eksekusi.

ichabod
sumber
1

Cara yang baik untuk melihat ini secara dinamis adalah menjalankan teratas, dan ini memberi tahu Anda keadaan sistem secara keseluruhan dan proses yang berjalan pada sistem.

Melakukan 'ps ux' menunjukkan proses Anda bersama dengan pid dan info lainnya, Anda dapat menggunakan keterampilan untuk mematikan beberapa dari mereka jika Anda inginkan, halaman manual untuk itu adalah sumber daya yang baik, dan melakukan keterampilan atau membunuh -9 mendapat proses yang lengket tergantung di perangkat menunggu dll. Anda juga dapat mengirim sinyal lain ke proses seperti -hup, mendapatkan daemon restart dll

Top bagus karena menunjukkan ukuran proses, waktu yang berlalu, dan status cpu saat ini serta memori dan swap.

Saya sering melakukan $ make> & make.out & dan kemudian kurang atau tail -f pada file log make.out. Sejak sekarang make terlepas sebagai proses dari sesi shell saya.


sumber