pengembangan-web-mp-pd.com

Bisakah saya Nohup / menyaring proses yang sudah dimulai?

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

Apakah ada cara untuk "retroaktif" Nohup suatu proses, atau apakah saya harus meninggalkan komputer saya online sepanjang malam? Jika tidak mungkin untuk melampirkan screen ke/Nohup sebuah proses yang sudah saya mulai, lalu mengapa? Ada hubungannya dengan bagaimana proses orang tua/anak berinteraksi? (Saya tidak akan menerima jawaban "tidak" yang setidaknya tidak menjawab pertanyaan 'mengapa' - maaf;))

262
ojrac

Jika Anda menggunakan Bash, Anda dapat menjalankan disown -h job

disown

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

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

212
gharper

Gunakan 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 dari penulisnya:

82
Jonathan Tran

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

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

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

22
Juliano

Ketika suatu proses dimulai, STDIN, STDOUT dan STDERR terhubung ke sesuat. Secara umum Anda tidak dapat mengubah itu setelah perintah dimulai. Dalam kasus yang Anda gambarkan, itu mungkin tty terkait dengan sesi ssh. Nohup cukup banyak hanya ...

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 yang langsung ke dirinya sendiri.

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

Anda mungkin beruntung dengan penolakan, tetapi tidak jika proses mencoba melakukan apa pun dengan STDIN, STDOUT, atau STDERR.

17
freiheit

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

Namun apakah Anda sudah mencoba disown (a 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.
13
serverhorror

Cryopid adalah pengembangan lebih lanjut dari penulis grab.c yang membekukan suatu proses menjadi file, yang kemudian Anda jalankan (layar bagian dalam) untuk melanjutkan proses.

13
TRS-80

Nohup pada Solaris/OpenSolaris memiliki flag -p untuk Nohup proses yang sedang berjalan - misalnya, lihat halaman manual Solaris 10 Nohup .

9
alanc

Baru-baru ini saya melihat tautan ke neercs , yang merupakan utilitas mirip layar yang dibuat menggunakan libcaca, pustaka ascii-art warna. Di antara fitur-fitur lain, ia menawarkan kemampuan untuk mengambil proses yang ada dan kembali menjadi orang tua di dalam sesi (layar) neercs Anda.

Saya belum menggunakannya, jadi saya tidak bisa mengomentari apakah itu berfungsi atau tidak.

5
Daniel Lawson

Anda dapat mengarahkan proses keluaran ke file dengan gdb

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

dan kemudian menolaknya

Upd: Saya harus menjalankan gdb dengan Sudo dan perintah gdb yang sedikit berbeda di Ubuntu 18.04:

p (int)dup2(open("/tmp/test.stdout", 1), 1)

2
d9k

Saya mungkin sedang memikirkan hal ini, jadi jangan ragu untuk mengoreksi saya (saya sudah belajar tentang penolakan!) ... Bukankah ctrl-Z dan "bg" bekerja setidaknya untuk menjalankan proses di latar belakang? Atau apakah masalah utama yang Anda masih ingin melihat STDOUT saat berjalan?

2
Chris_K

Jika Anda dapat hidup dengan tidak dapat berinteraksi dengan proses dan Anda tidak keberatan memuat modul kernel acak, Anda bisa melakukan lebih buruk daripada melihat Snoop . Atau, ada beberapa proyek lain. Di Sini adalah satu kode panggilan, yang sebagian besar dapat melakukan apa yang ingin Anda lakukan.

2
David Pashley

Saya ingin menggunakan Nohup (atau yang serupa) untuk memulai browser baris perintah links dan melampirkan setelah mengunduh file dari situs web ASP.NET dengan proses otentikasi yang rumit dan banyak status tampilan tersembunyi yang membuatnya sulit digunakan melakukan pekerjaan dengan curl/wget.

Saya akhirnya menggunakan tmux yang menyelesaikan pekerjaan dengan sangat baik:

  1. Jalankan tmux
  2. Jalankan aplikasi Anda (links dalam kasus saya) dan biarkan tetap berjalan
  3. Tutup sesi SSH, aplikasi akan tetap berjalan
  4. Terhubung dengan SSH ke mesin yang sama nanti dan jalankan tmux attach untuk membawa aplikasi kembali ke layar
1
Dmitry Gusev