Xác nhận lệnh từ chối


10

Tôi đã ban hành ^z; bg; disowntrình tự để cho phép tôi đóng một phiên ssh trong đó tôi đang chạy một quy trình dài cực kỳ quan trọng. Quá trình này ghi đầu ra trạng thái vào stderr và nó vẫn tiếp tục như vậy ngay cả sau khi được tách ra (được xác minh bằng lsof, stderr fd được mở cho r / w).

Có cách nào để xác định rằng quá trình thực sự đã bị từ chối (sẽ không recv SIGHUP nếu shell recvs một)?


1
Tôi tự hỏi nếu điều này cần phải đi đến unix.stackexchange.com
Rilindo

2
Chỉ tò mò, tại sao không: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Câu trả lời:


12

Trong Bash, disownlệnh do chính nó ban hành sẽ loại bỏ các quy trình (thông qua bghoặc &) nền từ bảng công việc đang hoạt động và đánh dấu chúng để không nhận SIGHUP khi đăng xuất.

Bạn cũng có thể vượt qua một hoặc nhiều công việc để từ chối, như thế nào disown 1 3. Các disown -hlá cờ rất hữu ích nếu bạn muốn giữ công việc trong bảng, nhưng vẫn không SIGHUP trên logout.

Bạn có thể xem bảng công việc bằng cách ban hành jobslệnh. Sau khi một nền tảng thành công, nó sẽ hiển thị [1]+ command &. Sau khi từ chối một công việc, nó sẽ không còn hiển thị trong bảng công việc và không còn bị giết khi đăng xuất. Bạn vẫn có thể xem quá trình thông qua ps ux, topvà các tiện ích quá trình xem khác.

Sau khi một công việc đã bị từ chối, bạn có thể đợi nó kết thúc một cách tự nhiên hoặc gửi tín hiệu qua killPID để dừng công việc đó.

Vì Bash chỉ xóa công việc khỏi danh sách các công việc đang chạy để chấm dứt và tệp xử lý đến thiết bị đầu cuối và thiết bị đầu cuối của bạn vẫn mở, nên bạn sẽ tiếp tục nhận đầu ra từ công việc cho đến khi thiết bị đầu cuối của bạn bị đóng (khi bạn đăng xuất) .

Ví dụ:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Tôi thường chỉ sử dụng disownnếu tôi chạy một lệnh có khả năng chạy dài như một rsynchoặc cpsau đó quyết định tôi cần phải đăng xuất mà không chấm dứt nó. Nếu bạn biết bạn sẽ chạy một lệnh và đăng xuất, bạn có thể nắm bắt đầu ra bằng cách dẫn hoặc đưa teenó vào một tệp, chạy nó nohuphoặc chạy nó screen(cho phép bạn lấy lại quyền sở hữu của lệnh / chấm dứt sau đó ).

Ví dụ:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null

1
+1 Thông tin và với các ví dụ. Đẹp!
Andy Smith

Nhận xét rất nhiều thông tin; bạn đang nói rằng không thể xác minh sự tách rời của một quá trình (ngoài việc lưu ý rằng nó không còn tồn tại trong bảng công việc)?
mikewaters

1
Khi bạn chạy detachtrên một công việc nền, nó sẽ bị tách ra :) không thực sự là một trung gian ở đó chạy nó trên một quy trình nền sẽ không làm gì cả. kiểm tra jobschỉ xác minh bạn đã không cố gắng tách ra một quá trình dừng lại hoặc một cái gì đó.
lunixbochs
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.