Pertanyaan Dapatkah saya membatalkan / menyaring proses yang sudah dimulai?


Saya melakukan beberapa uji coba skrip migrasi data yang berjalan lama, melalui SSH. Katakanlah saya mulai menjalankan skrip sekitar jam 4 sore; sekarang, jam 6 sore berguling-guling, dan aku mengutuk diriku sendiri karena tidak melakukan semua ini screen.

Apakah ada cara untuk "retroaktif" nohup sebuah proses, atau apakah saya harus meninggalkan komputer saya secara online sepanjang malam? Jika tidak mungkin dipasang screen untuk/nohup sebuah proses yang sudah saya mulai, lalu mengapa? Ada hubungannya dengan bagaimana orangtua / proses anak berinteraksi? (Saya tidak akan menerima jawaban "tidak" yang paling tidak menjawab pertanyaan 'mengapa' - maaf;))


247
2018-06-11 22:53




Baru saja melihat posting blog yang menarik tentang disown. blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the - ojrac


Jawaban:


Jika Anda menggunakan Bash, Anda bisa berlari disown -h job

memungkiri

disown [-ar] [-h] [jobspec ...]

Tanpa opsi, setiap jobspec dihapus dari tabel pekerjaan aktif.   Jika itu -h opsi diberikan, pekerjaan   tidak dihapus dari meja, tetapi   ditandai agar SIGHUP tidak dikirim ke   pekerjaan jika shell menerima   SIGHUP. Jika jobspec tidak ada, dan   baik itu -a maupun -r pilihannya adalah   disediakan, pekerjaan saat ini digunakan. Jika   tidak ada jobspec disediakan, yang -a   opsi berarti menghapus atau menandai semua   pekerjaan; itu -r opsi tanpa   argumen jobspec membatasi operasi   untuk menjalankan pekerjaan.


200
2018-06-11 23:03



Luar biasa; Saya berharap sesuatu seperti ini akan muncul. - ojrac
Hidup bisa tidak adil. gharper dan saya memposting ini pada waktu yang hampir bersamaan :) - serverhorror
Kamu adalah pahlawanku - Thomas Dignan
memungkiri tidak spesifik untuk bash. Ini juga di zsh, ksh93, ... - Phil P
Saya menemukan bahwa Anda benar-benar harus menggunakannya disown %1 jika 1 adalah jobspec, tidak seperti fg atau bg di mana Anda hanya menggunakan bg 1  serverwatch.com/tutorials/article.php/3935306/… - mltsy


Menggunakan reptyr

Dari README:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

Beberapa posting blog oleh penulisnya:


77
2018-05-22 21:27



Saya akan tetap menggunakan alat bawaan (yaitu disown), tetapi tidak sefleksibel reptyr. +1 - ojrac


Untuk mencuri proses dari satu tty ke tty saat ini, Anda mungkin ingin mencoba peretasan ini:

http://www.ucc.asn.au/~dagobah/things/grab.c

Diperlukan beberapa pemformatan ulang untuk mengkompilasi ke versi Linux / glibc saat ini, tetapi masih berfungsi.


22
2018-06-12 05:38



Sangat keren. - ojrac


Ketika sebuah proses dimulai, STDIN, STDOUT dan STDERR terhubung sesuatu. Umumnya Anda tidak dapat mengubah itu begitu perintah dimulai. Dalam kasus yang Anda jelaskan, itu mungkin tty yang terkait dengan sesi ssh. nohup cukup banyak ...

command < /dev/null > nohup.out 2>&1

Yaitu, set STDIN ke / dev / null, STDOUT ke file dan STDERR ke STDOUT. Layar melakukan hal-hal yang jauh lebih canggih yang melibatkan pengaturan ttys yang mengarahkan ke dirinya sendiri.

Saya tidak tahu cara untuk secara retroaktif nohup atau menyaring proses yang sedang berjalan. Jika Anda cd ke / proc / $ pid / fd dan lihat apa 0, 1 dan 2 mengarah ke.

Anda mungkin memiliki beberapa keberuntungan dengan tidak mengakui, tetapi tidak jika proses mencoba melakukan apa pun dengan STDIN, STDOUT atau STDERR.


16
2018-06-11 23:04



Beri +1 untuk komentar yang bagus. st (din | out | err) adalah separuh masalah lainnya, dan saya menghargai saran di mana harus mulai mencari, lain kali saya berada dalam kemacetan ini. - ojrac
Anda sebenarnya dapat mengubahnya di sebagian besar Unix. Ini adalah hack yang menjijikkan. Aku menyukainya. :) Yang Anda lakukan adalah, hubungkan ke proses menggunakan dukungan debug seperti ptrace, kemudian paksa proses untuk memanggil dup2 () untuk menghubungkan kembali 0,1,2 ke filehandle lain. - Zan Lynx
ya, kamu bisa mengubahnya. Melibatkan menghentikan proses (SIGSTOP), dan memodifikasi deskriptor file untuk fd 0, 1, 2. Kemudian restart (SIGCONT). - Michael Martinez


Cryopid adalah pengembangan lebih lanjut dari penulis grab.c yang membekukan proses ke file, yang kemudian Anda jalankan (di layar) untuk melanjutkan proses.


12
2018-06-14 18:26



Bagus! Saya mencoba menggunakan cryopid dalam disertasi master saya tentang migrasi proses, tetapi gagal bekerja sepanjang waktu, tidak peduli apa yang saya lakukan. Pada akhirnya, saya harus menggunakan dynckpt dengan versi Linux kuno. Apakah Anda mungkin terlibat dalam pengembangan cryopid? Saya melihat bahwa nama Anda mirip dengan domain penulis. - Juliano
Saya tidak terlibat dalam pengembangan, saya hanya tahu penulis dari universitas. Dia tidak punya waktu untuk memelihara cryopid saat ini, jadi sepertinya beberapa orang mulai mengerjakannya shareource.org/project/cryopid - TRS-80


Saya hanya bisa memberi Anda "Tidak" sederhana tanpa alasan untuk bagian layar, saya akan tertarik dengan alasan saya sendiri.

Namun apakah Anda sudah mencoba disown (bash builtin)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.

11
2018-06-11 23:02





nohup di Solaris / OpenSolaris memiliki tanda -p untuk nohup proses yang sedang berjalan - misalnya, lihat Solaris 10 halaman nohup man.


9
2018-06-13 00:59





Baru-baru ini saya melihat tautan neercs, yang merupakan utilitas seperti layar yang dibangun menggunakan libcaca, pustaka ascii-art berwarna. Di antara fitur-fitur lainnya, ia menawarkan kemampuan untuk mengambil proses yang sudah ada dan memasukkannya kembali ke dalam sesi neercs (layar) Anda.

Saya belum menggunakannya, jadi saya tidak bisa berkomentar apakah itu berhasil atau tidak.


5
2018-06-14 21:03