Apakah mungkin untuk menempatkan proses latar depan ke latar belakang tanpa menangguhkan (kontrol + z)?

11

Saya menjalankan aplikasi yang menerima paket TCP dan UDP dan karenanya tidak dapat ditangguhkan. Saya awalnya menjalankan 3 proses aplikasi yang sama, dengan argumen yang berbeda, dalam mode latar belakang menggunakan &. Ketika saya melakukannya saja $fg, ketiga proses muncul di latar depan. Sekarang saya ingin mengirim mereka ke latar belakang lagi tetapi tanpa penangguhan. Bagaimana saya bisa melakukan itu?

rahul.deshmukhpatil
sumber
Berikut adalah topik ServerFault tentang memindahkan proses yang sedang berjalan ke contoh layar baru -> serverfault.com/questions/55880/…
Alan Barber

Jawaban:

10

Hal pertama yang pertama: hanya ada satu proses di latar depan, bukan ketiga-tiganya. fgmembawa proses terbaru ke latar depan. Untuk membuat proses Ctrl+ z, kemudian mengetik bglebih cepat agar tidak "mengganggu" aplikasi yang dimaksud (perhatikan bahwa penjadwal proses akan melakukan hal ini berkali-kali per detik), cari tahu PID dari proses di latar depan, kemudian di terminal kedua / Sesi SSH, gunakan

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

Terminal asli Anda akan mengatakan stopped, tetapi karena Anda mengirim SIGCONTsegera, proses akan terus berjalan di latar belakang.

Stefan Seidel
sumber
1
@stefen: solusi Anda meyakinkan. Tidak ada salahnya proses saya dengan cara apapun, dengan asumsi bahwa jika kita menunda proses maka koneksi soket yang dibuat tidak putus (switching scheduler tidak memutuskan koneksi soket yakin ini). Akan men-debug ini dan memperbarui. Terima kasih banyak. If
rahul.deshmukhpatil
2

Jika Anda benar-benar memiliki pekerjaan latar depan, maka bash sedang menunggu untuk menyelesaikannya, itu kurang lebih definisi dari pekerjaan latar depan . Jika bash masih memiliki kendali terminal, periksa apa yang terjadi jobs -l, misalnya:

$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1]  13404 Running                 ncat -kl -p 10111 &
[2]- 13405 Running                 ncat -kl -p 10222 &
[3]+ 13406 Running                 ncat -kl -p 10333 &

Saya memulai tiga ncatproses mendengarkan latar belakang untuk ini. Anda juga dapat melihat "Selesai" atau "Dihentikan" untuk status pekerjaan.

Anda dapat secara efektif latar belakang pekerjaan latar depan dari shell yang berbeda menggunakan metode SIGSTOP / SIGCONT Stefan Seidel (meskipun sinyal sebenarnya dikirim oleh shell dengan Ctrl- Zadalah SIGTSTP, baik sinyal harus bekerja).

Ada perbedaan halus antara proses dan pekerjaan ketika istilah latar depan dan latar belakang digunakan. Hanya ada satu pekerjaan foreground shell , bisa ada beberapa proses foreground (ini terkait dengan ID grup proses terminal , dan dapat diamati ketika Anda memulai dua proses atau lebih dalam pipa).

Proses atau pipa yang berjalan di bawah kendali shell disebut sebagai "pekerjaan", ketika Anda menggunakan perintah bgatau fgAnda secara implisit merujuk pekerjaan terbaru - dalam kasus saya yang ada +di atas. Pekerjaan-pekerjaan ini juga dapat (antara lain) disebut secara eksplisit sebagai% 1% 2 atau% 3 (angka dalam []).

Perintah yang tidak memenuhi syarat fghanya akan mempengaruhi satu pekerjaan, yang paling baru, sehingga Anda mungkin salah dalam memahami situasi saat ini. Pekerjaan latar belakang mungkin masih menulis ke terminal:

  echo foo > /dev/tcp/127.0.0.1/10111

Itu bisa tergantung pada bagaimana program menangani terminal, ncatberfungsi dengan baik untuk menulis. Untuk membaca meskipun program akan menghentikan eksekusi, dan Anda akan melihat pesan "Berhenti". Shell akan memulai proses dan menunggu mereka keluar atau menerima sinyal SIGTTIN ( nohupada cara lain seperti ini disown).

Anda dapat latar belakang tertentu berhenti pekerjaan dengan

$ bg %3

(dalam kasus saya, saya akan mendapatkan kesalahan bash: bg: job 3 already in background)

Kalau tidak, jika suatu proses di latar depan, kecuali program menangkap SIGTSTP dan melakukan sesuatu yang istimewa, itu tidak mungkin memiliki masalah dengan cepat Ctrl- Zdan bg. Tidak ada yang istimewa tentang program jaringan dalam hal ini, koneksi / data yang masuk akan disangga oleh kernel (sampai titik tertentu). Sambungan streaming mungkin memiliki jeda yang bisa diamati.

Lihat bagian " JOB CONTROL " dari halaman bash man untuk lebih jelasnya.

mr.spuratic
sumber
1

Cara termudah bagi Anda untuk melakukan ini adalah dengan menggunakan program layar . Anda dapat memulai aplikasi dalam terminal virtual, lalu keluar dari layar dengan Ctrl + A, D. Jika Anda ingin melanjutkan sesi Anda, ketik Anda screen -x. Jika Anda memiliki beberapa proses, Anda akan disajikan daftar layar untuk disambungkan kembali. Untuk lebih jelasnya silakan baca halaman manual layar .

Janos Pasztor
sumber
5
Saya pikir dia sedang mencari solusi "setelah fakta", yaitu proses sedang berjalan sekarang.
Stefan Seidel