Sau thực tế từ xa nohup với tcsh


11

Tôi có một ví dụ tcsh trong một xterm đang chạy quá trình dài hạn (tuần?). Máy chủ Xvnc đang chạy trong đám cỏ dại; nó tiêu thụ 100% CPU và không phản hồi. (Đây là một lỗi đã biết và tôi biết rằng nó không thể phục hồi được.)

Quá trình dài hạn hiện đang chặn trên thiết bị xuất chuẩn.

Có cách nào để tôi có thể giết chết một quy trình cơ bản - tcsh, xterm, bất cứ điều gì - và giữ cho quá trình dài hạn đó chạy không?

(Xin vui lòng, không có câu trả lời nào screen. Tôi biết. Đây không phải là quá trình của tôi; đó là người dùng. Họ sẽ không học.)

Câu trả lời:


17

Bài này có thể giúp. Đề xuất là:

  1. nền quá trình (với Ctrl-Z, sau đó bg )
  2. chạy disown -h% [jobid] (có thể là bash-ism, vì vậy bạn sẽ phải dịch cho tcsh)

Tất nhiên, tin xấubg sẽ cần phải được thực hiện trong cùng một shell mà quá trình đang chạy trong ... nhưng ... nó có thể đã được làm nền.

Tin xấu thực sự là cuộc gọi từ chối có thể cần phải được thực hiện trong cùng một vỏ. Trong trường hợp đó, vâng, bạn đang say sưa. Nhưng tôi không chắc chắn, có lẽ root có thể buộc ngắt kết nối nó.

Hừm. Tin tốt có thể - tcsh sẽ tự động từ chối :

Nếu tcsh thoát bất thường, nó sẽ tự động loại bỏ các công việc đang chạy trong nền khi nó thoát.

Vì vậy, nếu quá trình dài hạn của bạn đã được nền tảng, việc giết cha mẹ tcsh của nó sẽ cho phép nó tiếp tục. Quá trình bây giờ bị ngắt kết nối từ thiết bị đầu cuối bắt đầu. (Nếu không, hãy xem "tin xấu" ở trên.)

Thật không may, nó không phải là màn hình, vì vậy không có kết nối lại thực sự. Bạn có thể giả mạo nó bằng gdb có thể (một lần nữa, từ liên kết đầu tiên):

[...] Với một số hack bẩn, không thể mở lại quy trình 'stdout / stderr / stdin.

Vì vậy, bạn vẫn có thể tạo một cửa sổ màn hình trống (ví dụ chạy chế độ ngủ).

Và sau đó sử dụng gdb để đính kèm vào quy trình, thực hiện một số cuộc gọi close (0)
gọi close (1)
gọi close (2)
gọi open ("/ dev / pts / xx", ...)
gọi dup (0)
gọi dup (0)
tách ra

Đầu ra của quá trình sẽ đi đến màn hình. Nó sẽ không được gắn vào thiết bị đầu cuối màn hình đó, vì vậy, ví dụ [sic] sẽ giết lệnh "ngủ", không phải là quá trình, nhưng điều đó có thể đủ cho OP.

Tôi tự hỏi liệu không nên có "gọi dup (1)" và "gọi dup (2)" trong quá trình đó ...


Vâng, đó là một quá trình tiền cảnh, vì vậy tôi đoán tôi đã bị lừa.
wfaulk

Vâng. Nhưng như bạn đã nói, đó không phải là quá trình của bạn, không phải lỗi của bạn. xin lỗi bạn bị mắc kẹt với mớ hỗn độn, tho.
quack quixote

2
Điều này hoàn toàn chỉ lưu ass của tôi. Tôi đã gặp phải cùng một vấn đề mà tôi đã đăng lúc đầu, đó là quá trình bị chặn trên STDOUT khi máy chủ X (và, tôi đoán, xterm ở giữa) được kết hợp. Hóa ra tôi không thực sự cần phải làm bất cứ điều gì ngoại trừ đóng STDOUT. Đầu ra đó không liên quan; dữ liệu thực sự nằm trong một tệp nhật ký ở đâu đó. Vì vậy, tôi đã có thể đính kèm với gdb, chạy "gọi gần (1)" và sau đó "tiếp tục" và nó lại tiếp tục. Cám ơn rất nhiều!
wfaulk

Huh! hấp dẫn. mà tháo gỡ mọi thứ? sự kì lạ. rất vui vì nó đã giúp tho!
quack quixote

2
Có thể đáng để chỉ ra rằng việc gửi "Ctrl-Z" tới một quá trình tiền cảnh và gửi SIGSTOP tới pid của nó là điều tương tự. (SIGCONT bắt đầu lại quá trình một lần nữa.) Tôi không biết liệu điều này có hữu ích cho những người khác trong tình huống tương tự hay không, nhưng, trong thử nghiệm nhanh của tôi, gửi SIGSTOP theo sau là SIGCONT sao chép "Ctrl-Z" theo sau bg.
wfaulk

3

Những câu hỏi này đề cập đến một chương trình có tên Cryopid có thể giúp bạn. Tôi không có bất kỳ kinh nghiệm với nó, tuy nhiên.

Di chuyển một quá trình giữa các máy chủ

Di chuyển xterms giữa các phiên X

Nohup và sàng lọc một quá trình


CryoPID nghe có vẻ rất gọn gàng, nhưng tôi đã có một nhóm các quy trình và nó không hỗ trợ đóng băng và tiếp tục nhiều quy trình, ít nhất là chưa.
wfaulk
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.