Trong Bash, disown
lệnh do chính nó ban hành sẽ loại bỏ các quy trình (thông qua bg
hoặ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 -h
lá 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 jobs
lệ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
, top
và 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 kill
PID để 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 disown
nếu tôi chạy một lệnh có khả năng chạy dài như một rsync
hoặc cp
sau đó 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 tee
nó vào một tệp, chạy nó nohup
hoặ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