it-swarm-vi.tech

Tôi có thể Nohup / sàng lọc một quy trình đã bắt đầu không?

Tôi đang thực hiện một số lần chạy thử các tập lệnh di chuyển dữ liệu chạy dài, qua SSH. Giả sử tôi bắt đầu chạy một kịch bản vào khoảng 4 giờ chiều; bây giờ, 6 PM lăn lộn và tôi tự nguyền rủa mình vì đã không làm tất cả điều này trong screen.

Có cách nào để "hồi tố" Nohup một quy trình hay tôi cần phải rời khỏi máy tính trực tuyến cả đêm? Nếu không thể đính kèm screen vào/Nohup một quá trình tôi đã bắt đầu thì tại sao? Một cái gì đó để làm với cách cha mẹ/con tương tác? (Tôi sẽ không chấp nhận câu trả lời "không" mà ít nhất không giải quyết câu hỏi "tại sao" - xin lỗi;))

262
ojrac

Nếu bạn đang sử dụng Bash, bạn có thể chạy disown -h job

từ chối

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

Không có tùy chọn, mỗi jobspec sẽ bị xóa khỏi bảng công việc đang hoạt động. Nếu -h tùy chọn được đưa ra, công việc không bị xóa khỏi bảng, nhưng được đánh dấu để SIGHUP không được gửi đến công việc nếu Shell nhận được SIGHUP. Nếu jobspec không có mặt và cả -a cũng không -r tùy chọn được cung cấp, công việc hiện tại được sử dụng. Nếu không có jobspec được cung cấp, -a tùy chọn có nghĩa là loại bỏ hoặc đánh dấu tất cả các công việc; các -r tùy chọn không có đối số jobspec sẽ hạn chế hoạt động đối với các công việc đang chạy.

212
gharper

Sử dụng reptyr

Từ 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.)

Một vài bài viết trên blog của tác giả:

82
Jonathan Tran

Để đánh cắp một quá trình từ một tty đến tty hiện tại của bạn, bạn có thể muốn thử bản hack này:

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

Nó cần một số định dạng lại để biên dịch sang các phiên bản Linux/glibc hiện tại, nhưng vẫn hoạt động.

22
Juliano

Khi một quá trình bắt đầu, STDIN, STDOUT và STDERR được kết nối với một cái gì đó. Nói chung, bạn không thể thay đổi điều đó một khi lệnh được bắt đầu. Trong trường hợp bạn đang mô tả, đó có lẽ là một tty liên quan đến phiên ssh. Nohup khá nhiều chỉ ...

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

Đó là, đặt STDIN thành/dev/null, STDOUT thành một tệp và STDERR thành STDOUT. Màn hình thực hiện những điều phức tạp hơn nhiều liên quan đến việc thiết lập ttys trực tiếp với chính nó.

Tôi không biết cách nào để hồi tố Nohup hoặc sàng lọc một quy trình đang chạy. Nếu bạn cd tới/Proc/$ pid/fd và xem 0, 1 và 2 trỏ tới cái gì.

Bạn có thể gặp một số may mắn khi bị từ chối, nhưng nếu quá trình này cố gắng làm bất cứ điều gì với STDIN, STDOUT hoặc STDERR.

17
freiheit

Tôi chỉ có thể cung cấp cho bạn một chữ "Không" đơn giản mà không có lý do tại sao cho phần màn hình, tôi sẽ quan tâm đến lý do bản thân mình.

Tuy nhiên, bạn đã thử disown (một bash dựng sẵn)

~ $ 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 là một sự phát triển hơn nữa từ tác giả của Grab.c, đóng băng một quy trình vào một tệp, sau đó bạn chạy (bên trong màn hình) để tiếp tục quá trình.

13
TRS-80

Nohup trên Solaris/OpenSolaris có cờ -p để Nohup một quy trình đang chạy - ví dụ: xem trang người dùng Solaris 10 Nohup .

9
alanc

Gần đây tôi đã thấy một liên kết đến neercs , đây là một tiện ích giống như màn hình được xây dựng bằng libcaca, một thư viện nghệ thuật ascii màu. Trong số các tính năng khác, nó tự hào có khả năng lấy một quy trình hiện có và đặt lại nó trong phiên neercs (màn hình) của bạn.

Tuy nhiên, tôi chưa sử dụng nó, vì vậy tôi không thể nhận xét liệu nó có hoạt động hay không.

5
Daniel Lawson

Bạn có thể chuyển hướng quá trình đầu ra thành tệp với gdb

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

và sau đó từ chối nó

Trình cập nhật: Tôi đã phải chạy gdb với Sudo và lệnh gdb hơi khác trong Ubuntu 18.04:

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

2
d9k

Có lẽ tôi đang suy nghĩ về vấn đề này nên cảm thấy thoải mái khi sửa lỗi cho tôi (tôi đã tìm hiểu về sự thất vọng!) ... Sẽ không một ctrl-Z và "bg" hoạt động để ít nhất có được quá trình chạy trong nền? Hoặc là vấn đề chính mà bạn vẫn muốn thấy STDOUT trong khi nó chạy?

2
Chris_K

Nếu bạn có thể sống mà không thể tương tác với quy trình và bạn không phản đối việc tải các mô-đun hạt nhân ngẫu nhiên, bạn có thể làm điều tồi tệ hơn là nhìn vào Snoop . Ngoài ra, có một vài dự án khác. Ở đây là một mã số cuộc gọi, phần lớn có thể làm những gì bạn muốn làm.

2
David Pashley

Tôi muốn sử dụng Nohup (hoặc tương tự) để khởi động trình duyệt dòng lệnh links và đính kèm với nó sau để tải xuống một tệp từ trang web ASP.NET với quá trình xác thực phức tạp và nhiều trạng thái xem ẩn gây khó khăn khi sử dụng thực hiện công việc với curl/wget.

Cuối cùng tôi đã kết thúc bằng cách sử dụng tmux đã giải quyết công việc tuyệt vời:

  1. Chạy tmux
  2. Chạy ứng dụng của bạn (links trong trường hợp của tôi) và để nó chạy
  3. Đóng phiên SSH, ứng dụng sẽ vẫn chạy
  4. Kết nối với SSH với cùng một máy sau đó và chạy tmux attach để đưa ứng dụng trở lại màn hình
1
Dmitry Gusev