Bagaimana saya bisa berhenti mengikuti output dalam waktu kurang, tanpa mempengaruhi perintah menghasilkan output?

11

Saya menjalankan server dan log server ini masuk terminal, bukan dalam file apa pun. Saya ingin menggunakan lebih sedikit untuk melihat log ini.

node server.js | less

Ketika saya hanya ingin melihat log, saya menggunakan tekan Shift+ Funtuk sampai ke akhir file dan terus menonton log. Ketika saya ingin menghentikannya, saya menggunakan CTRL+ C.

Sayangnya, ini juga menghentikan server. Saya hanya ingin berhenti menonton akhir log tanpa menghentikan server.

Bagaimana cara melakukannya?

Ajay Kumar
sumber
1
Apakah Anda ingin keluar lessdan kembali ke prompt shell Anda dengan nodeserver berjalan di latar belakang, atau apakah Anda hanya ingin lesskembali ke mode non-following normal di mana Anda dapat menggulir log daripada melihat baris terbaru?
Byte Commander
@ByteCommander ketika saya menekan CTRL + C. saya ingin server saya terus berjalan dan saya ingin kembali ke mode tidak mengikuti yang kurang normal, di mana saya dapat menggulir.
Ajay Kumar

Jawaban:

16

Saya tidak dapat menemukan cara untuk keluar dari Fmode less, jadi Anda harus menggunakan solusi. Sebagai contoh, simpan output ke file tmp dan kemudian tonton tmpfile itu sebagai gantinya:

node server.js > tmpfile & less tmpfile

The &membuat node.jsperintah berjalan di latar belakang. Ini berarti bahwa less tmpfileakan segera dimulai dan akan melacak tmpfile.

Setelah masuk less, Anda dapat menekan Funtuk masuk ke mode ikuti tetapi sekarang Ctrl+ Ctidak akan membunuh server, itu hanya akan menghentikan tindak. Anda sekarang dapat menggulir di sekitar seperti yang Anda inginkan dan dapat menekan Funtuk melanjutkan mengikuti.

terdon
sumber
13

Tampaknya Anda biasanya tidak seharusnya keluar dari mode "Teruskan selamanya", yaitu cara manual man lessmenyebutkan mode yang Anda masukkan saat menekan Shift+ F.

Namun, saya menemukan sedikit trik kotor bagaimana Anda dapat kembali normal. Ini akan membekukan perintah sebentar, jadi saya tidak yakin apakah itu akan cocok untuk server Anda yang mungkin harus berjalan tanpa gangguan.


Bagaimanapun, inilah caranya:

Saya berasumsi bahwa Anda sudah memulai node server.js | lessdan menekan Shift+ Funtuk masuk ke mode "Maju selamanya". Sekarang lesstidak bereaksi terhadap penekanan tombol lagi.

Dalam keadaan ini, Anda bisa menekan Ctrl+ Cuntuk mematikan proses server dan dapat berhenti lesssetelah itu dengan menekan Q(yang bagaimanapun akan meninggalkan perintah sebagai proses yang terhenti dalam daftar pekerjaan Anda - Anda harus menjalankan fguntuk melanjutkan dan membiarkannya sepenuhnya berakhir setelah itu), tetapi ini bukan yang kita inginkan.

Sebagai gantinya, Anda juga dapat menekan Ctrl+ Zuntuk menghentikan ("membekukan") perintah dan kembali ke prompt shell Anda. Sekarang dengan cepat ketik perintah shell fg(" f ore g round") untuk membiarkan perintah terus berjalan di latar depan. Perhatikan bahwa nodeproses server Anda juga dijeda selama waktu yang singkat ini, Anda harus mempertimbangkan apakah ini dapat diterima atau tidak.

Jadi sekarang lessberjalan di latar depan lagi seperti sebelumnya, kan? Ya, tetapi secara ajaib itu tidak lagi dalam mode "Teruskan selamanya". Anda dapat menggunakan misalnya tombol panah lagi untuk menggulir ke atas dan ke bawah.

Sayangnya, lesstampaknya telah berhenti memperbarui buffer-nya sepenuhnya, Anda hanya dapat menggulir ke bawah di mana Anda membekukan perintah sebelumnya, tidak lebih jauh. The nodeserver masih berjalan dan menghasilkan output meskipun, kita hanya perlu mendapatkan lessuntuk menyegarkan lagi.

Cara termudah yang saya temukan untuk melakukannya adalah dengan hanya membuka lesslayar bantuan dan menutupnya lagi, dengan menekan tombol Hdan Qsecara berurutan. Sekarang semuanya tampaknya berfungsi dengan baik lagi.


Namun solusi terbersih mungkin adalah mengikuti jawaban terdon dan mengarahkan output ke file temp, gunakan lessuntuk memonitor file.

Komandan Byte
sumber
Retas kotor yang agak brilian.
TRiG
Saya pikir saya lebih suka jawaban ini daripada yang diterima. Perhatikan bahwa Anda dapat menjalankan %daripada fg; Saya merasa lebih mudah / lebih cepat mengetik. Juga tampaknya F(shift-f) masih berfungsi bahkan tanpa melakukan hqtrik. Bagus! Sekarang ketika saya mengikuti log, saya bisa ctrl-z % Enter, melakukan lebih sedikit, kemudian kembali mengikuti dengan memukul F!
JoL
BTW, Anda seharusnya tidak menyebutnya kotor. Secara pribadi, ini tampaknya lebih bersih daripada solusi lain karena, di sini, Anda tidak perlu membuang sistem file Anda dengan file sementara (yang Anda harus memikirkan nama dan kemudian menghapus), terutama ketika Anda mungkin ingin menggunakan lessikuti fitur di beberapa terminal secara bersamaan.
JoL
2
Saya belum melihat sumbernya, tetapi ini mungkin berhasil karena TSTPsinyalnya mengganggu panggilan sistem baca yang sedang menunggu data baru tiba; lessmenerima 0 byte dan menyimpulkan bahwa output telah berakhir. Untuk menghindari menjeda server, buka jendela terminal baru; melaksanakan psdan mengidentifikasi id proses dari lessproses tersebut; lalu ketik kill -TSTP <PID>; kill -CONT <PID>. Dengan cara ini sinyal harus dikirim kembali ke belakang, tanpa penundaan saat Anda mengetik.
alexis
@alexis jika Anda akan menggunakan kill, Anda bisa mengirim SIGINT saja. Maka Anda tidak perlu mengirim CONT, dan lesshanya menunggu Anda.
muru
3

Seperti kata pertanyaan Anda:

Server ini masuk terminal, bukan dalam file apa pun.

Saya berasumsi bahwa Anda tidak ingin menggunakan file log (temp), mungkin log Anda besar atau untuk alasan apa pun yang Anda miliki.


Named pipe, fifofile.

Apa yang saya hasilkan adalah menggunakan file yang named pipe filejuga dikenal sebagai fifofile, file ini hanya akan digunakan untuk mengurangi jumlah log Anda, dan tidak ada yang disimpan di dalamnya.

Pertama buat fifo file:

mkfifo mylog

Jalankan server Anda dan arahkan kembali log ke file ini:

node server.js > mylog &

Gunakan lebih sedikit untuk membaca log Anda (-sekarang lebih sedikit untuk membaca file khusus ini):

less -f mylog

Sekarang Anda dapat menggunakan shift+ Funtuk mengikuti, dan CTRL+ Cuntuk menghentikan ikuti, tetapi server masih berjalan, Anda dapat mengikuti output lagi dengan shift+ F.


Paket cadangan : Jika itu menghentikan server Anda, cukup masukkan perintah Anda ( node server.js > mylog &) ke dalam file, misal:, server.shmaka alih-alih jalankan node server.js > mylog &jalankan: bash server.sh > mylog &dan kemudian jalankan less -f mylog.

Ravexina
sumber
Apa gunanya menggunakan fifo daripada file biasa di sini? Satu-satunya manfaat yang dapat saya lihat adalah menghemat ruang disk tetapi saya ragu apakah itu relevan untuk hal seperti ini. Anda masih akan memiliki file di sana setelah selesai dan Anda harus menghapusnya secara manual.
terdon
2
Saya merekomendasikan terhadap FIFO di sini karena proses server dapat berhenti jika buffer FIFO berjalan penuh ketika tidak ada yang meminta (lebih) data log. Jika ukuran file log menjadi masalah orang harus benar-benar menggunakan file log yang tepat plus logrotate.
David Foerster
@terdon Seperti yang Anda katakan, satu-satunya titik adalah menyimpan disk, saya pikir OP tidak ingin log-nya disimpan di disk.
Ravexina
@DavidFoerster +1 Good Point;)
Ravexina