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


260

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 giờ chiều, và tôi tự nguyền rủa mình vì đã không làm tất cả những điều này screen.

Có cách nào để "hồi tố" nohupmột quy trình, hay tôi cần phải để máy tính trực tuyến cả đêm? Nếu không thể đính kèm screenvào / nohupmột quy 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 là không giải quyết câu hỏi "tại sao" - xin lỗi;))


4
Chỉ cần nhìn thấy một bài viết blog thú vị về disown. blog.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

Câu trả lời:


212

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ác công việc đang hoạt động. Nếu -htùy chọn được đưa ra, công việc sẽ 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ả tùy chọn -acũng không -rđược cung cấp, công việc hiện tại sẽ đượ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 -rtùy chọn mà không một đối số JOBSPEC hạn chế hoạt động để chạy việc làm.


Tuyệt vời; Tôi đã hy vọng một cái gì đó như thế này sẽ bật lên.
ojrac

7
Cuộc sống có thể không công bằng. gharper và tôi đã đăng bài này cùng một lúc :)
dị

4
Bạn là anh hùng của tôi
Thomas Dignan

9
disown không cụ thể để bash. Nó cũng ở zsh, ksh93, ...
Phil P

2
Tôi thấy rằng bạn thực sự phải sử dụng disown %1nếu 1 là jobspec, không giống như fg hoặc bg khi bạn chỉ sử dụng bg 1 serverwatch.com/tutorials/article.php/3935306/
Lỗi

81

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ả:


Tôi sẽ gắn bó với các công cụ tích hợp (nghĩa là không thích), nhưng nó không linh hoạt như reptyr. +1
ojrac

22

Để đá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.


1
Đặc biệt mát mẻ.
ojrac

16

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ó thể là một tty liên quan đến phiên ssh. nohup khá nhiều chỉ là ...

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ố hoặc sàng lọc một quy trình đang chạy. Nếu bạn cd đến / Proc / $ pid / fd và xem 0, 1 và 2 trỏ đến điều gì.

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


2
+1 cho các bình luận tốt. st (din | out | err) là một nửa còn lại của vấn đề, và tôi đánh giá cao lời khuyên về nơi bắt đầu tìm kiếm, lần tới khi tôi gặp rắc rối này.
ojrac

6
Bạn thực sự có thể thay đổi nó trên hầu hết các Unix. Đó là một hack kinh tởm. Tôi thích nó. :) Những gì bạn làm là, kết nối với quy trình bằng cách sử dụng hỗ trợ gỡ lỗi như ptrace, sau đó buộc quy trình gọi dup2 () để kết nối lại 0,1,2 với tập tin khác.
Zan Lynx

2
Vâng, bạn có thể thay đổi nó. Liên quan đến việc tạm dừng quá trình (SIGSTOP) và sửa đổi các mô tả tệp cho fd 0, 1, 2. Sau đó khởi động lại (SIGCONT).
Michael Martinez

13

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.


1
Đẹp! Tôi đã cố gắng sử dụng cryopid trong luận văn thạc sĩ về quá trình di chuyển, nhưng nó không hoạt động mọi lúc, bất kể tôi đã làm gì. Cuối cùng, tôi đã phải sử dụng dynckpt với một phiên bản Linux cổ. Có lẽ bạn có liên quan đến sự phát triển của cryopid? Tôi thấy rằng tên của bạn giống với tên miền của tác giả.
Juliano

1
Tôi không tham gia vào sự phát triển, tôi chỉ biết tác giả từ trường đại học. Anh ấy không có thời gian để duy trì cryopid vào lúc này, vì vậy có vẻ như một số người bắt đầu làm việc với nó tại Sharesource.org/project/cryopid
TRS-80

12

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.


5

Gần đây tôi đã thấy một liên kết đến neercs , 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 về việc nó có hoạt động hay không.


2

Có lẽ tôi đang suy nghĩ kém về vấn đề này nên cảm thấy thoải mái khi sửa lỗi cho tôi Hoặc là vấn đề chính mà bạn vẫn muốn thấy STDOUT trong khi nó chạy?


1
Điều đó vẫn sẽ giết quá trình khi sở hữu tty chết, vì vậy OP cần phải rời khỏi hộp nơi anh ta thực hiện lệnh đang chạy, đó là điều anh ta muốn tránh
dị

OK tôi sẽ mua nó. Cảm ơn đã giải thích. Vì vậy, các đề xuất từ ​​chối -h chắc chắn trông thông minh hơn tôi rất nhiều :-)
Chris_K

1
Bạn vẫn có thể làm điều này, ngay sau khi bạn phải từ chối -h: stackoverflow.com/a/625436/705198
AndrewPK

2

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ã lệnh gọi, phần lớn có thể làm những gì bạn muốn làm.



1

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

Cuối cùng tôi đã kết thúc bằng cách sử dụng tmuxmà 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 ( linkstrong 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

tmux là tuyệt vời - nhưng, giống như nohup hoặc màn hình, nó chỉ hoạt động nếu bạn sử dụng nó trước khi bắt đầu quá trình của bạn. Câu hỏi này là về những lần bạn nhận ra mình cần tmux sau khi quy trình của bạn đã chạy.
ojrac

-1

Có phải bạn đang lo lắng về việc hết giờ? Trong trường hợp đó, bạn có thể Ctrl-z và bg tiến trình, sau đó chỉ cần đặt một cái gì đó để giữ cho phiên hoạt động như một "ping -t localhost" hoặc "top".

Nếu bạn muốn đăng xuất, thì tôi sợ rằng tôi không thể thêm vào các bình luận khác.


Đó là điều đăng xuất.
ojrac

1
Một cách khác để ngăn chặn nó ngắt kết nối là chạy hàng đầu. Đó luôn luôn xáo trộn một vài byte xung quanh.
Rory
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.