Bisakah saya nohup / menyaring proses yang sudah dimulai?

260

Saya sedang melakukan beberapa uji coba skrip migrasi data yang berjalan lama, melalui SSH. Katakanlah saya mulai menjalankan skrip sekitar jam 4 sore; sekarang, 18:00 gulungan sekitar, dan aku mengutuk diriku sendiri karena tidak melakukan ini semua di screen.

Apakah ada cara untuk "secara surut" nohupproses, atau apakah saya harus meninggalkan komputer saya online sepanjang malam? Jika tidak mungkin untuk melampirkan screen/ nohupproses 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;))

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

Jawaban:

212

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

memungkiri

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

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

gharper
sumber
Luar biasa; Saya berharap sesuatu seperti ini akan muncul.
ojrac
7
Hidup bisa tidak adil. gharper dan saya sedang posting ini pada waktu yang sama :)
serverhorror
4
Anda adalah pahlawan saya
Thomas Dignan 9'10
9
disown tidak khusus untuk bash. Ini juga dalam zsh, ksh93, ...
Phil P
2
Saya menemukan bahwa Anda benar-benar harus menggunakan disown %1jika 1 adalah jobspec, tidak seperti fg atau bg di mana Anda hanya menggunakan bg 1 serverwatch.com/tutorials/article.php/3935306/…
mltsy
81

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:

Jonathan Tran
sumber
Saya akan tetap menggunakan alat bawaan (yaitu disown), tapi tidak sefleksibel reptyr. +1
ojrac
22

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.

Juliano
sumber
1
Sangat keren.
ojrac
16

Ketika suatu proses dimulai, STDIN, STDOUT dan STDERR terhubung ke sesuatu . 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 menutup atau menyaring proses berjalan secara surut. Jika Anda melakukan cd ke / proc / $ pid / fd dan lihat apa maksud 0, 1 dan 2.

Anda mungkin memiliki sedikit keberuntungan dengan penolakan, tetapi tidak jika proses mencoba melakukan sesuatu dengan STDIN, STDOUT atau STDERR.

freiheit
sumber
2
+1 untuk komentar yang bagus. st (din | out | err) adalah bagian lain dari masalah, dan saya menghargai saran tentang di mana mulai mencari, lain kali saya dalam kemacetan ini.
ojrac
6
Anda sebenarnya dapat mengubahnya di sebagian besar Unix. Ini hack menjijikkan. Aku menyukainya. :) Yang Anda lakukan adalah, sambungkan ke proses menggunakan dukungan debug seperti ptrace, lalu paksa proses untuk memanggil dup2 () untuk menyambungkan kembali 0,1,2 ke filehandle lain.
Zan Lynx
2
ya, Anda bisa mengubahnya. Melibatkan menghentikan proses (SIGSTOP), dan memodifikasi deskriptor file untuk fd 0, 1, 2. Kemudian restart (SIGCONT).
Michael Martinez
13

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.

TRS-80
sumber
1
Bagus! Saya mencoba menggunakan cryopid dalam disertasi master saya tentang migrasi proses, tetapi gagal bekerja setiap saat, apa pun 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
1
Saya tidak terlibat dalam pengembangan, saya hanya tahu penulis dari universitas. Dia tidak punya waktu untuk mempertahankan cryopid saat ini, jadi sepertinya beberapa orang mulai mengerjakannya di sharesource.org/project/cryopid
TRS-80
12

Saya hanya bisa memberi Anda "Tidak" sederhana tanpa alasan untuk bagian layar, saya akan tertarik pada alasannya 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.
serverhorror
sumber
9

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

alanc
sumber
5

Baru-baru ini saya melihat tautan ke neercs , yang merupakan utilitas seperti 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.

Daniel Lawson
sumber
2

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

Chris_K
sumber
1
Yang masih akan membunuh proses ketika tty memiliki meninggal sehingga OP perlu meninggalkan kotak di mana ia intiated berjalan perintah, yang adalah apa yang ia ingin menghindari
serverhorror
OK saya akan membelinya. Terima kasih untuk penjelasannya. Jadi saran yang
ditolak
1
Anda masih bisa melakukan ini, hanya setelah Anda harus menolak -h: stackoverflow.com/a/625436/705198
AndrewPK
2

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. Berikut ini adalah satu kode panggilan, yang sebagian besar dapat melakukan apa yang ingin Anda lakukan.

David Pashley
sumber
1

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

Saya akhirnya menggunakan tmuxyang memecahkan pekerjaan dengan sangat baik:

  1. Lari tmux
  2. Jalankan aplikasi Anda ( linksdalam kasus saya) dan biarkan berjalan
  3. Tutup sesi SSH, aplikasi akan tetap berjalan
  4. Terhubung dengan SSH ke mesin yang sama nanti dan jalankan tmux attachuntuk membawa aplikasi kembali ke layar
Dmitry Gusev
sumber
tmux bagus - tetapi, seperti nohup atau layar, itu hanya berfungsi jika Anda menggunakannya sebelum memulai proses Anda. Pertanyaan ini adalah tentang saat-saat ketika Anda menyadari Anda perlu tmux setelah proses Anda sudah berjalan.
ojrac
-1

Apakah Anda khawatir tentang waktu sesi habis? Dalam hal ini Anda bisa Ctrl-z dan bg proses, dan kemudian hanya meletakkan sesuatu untuk menjaga sesi tetap hidup seperti "ping -t localhost" atau "top".

Jika Anda ingin keluar, maka saya khawatir saya tidak dapat menambahkan komentar lainnya.

TrojanName
sumber
Ini masalah logout.
ojrac
1
Cara lain untuk menghentikannya memutus hubungan adalah menjalankan posisi teratas. Itu selalu mengocok beberapa byte di sekitar.
Rory