2010-11-28 30 views
16

Theo như tôi hiểu từ sách hướng dẫn sử dụng và sổ tay đó là. Khi người dùng đăng xuất khỏi bash, tất cả các công việc nền được bắt đầu bởi người dùng sẽ tự động chấm dứt, nếu anh ta không sử dụng nohup hoặc bị xóa. Nhưng hôm nay tôi đã thử nghiệm nó:Cách bash xử lý công việc khi đăng xuất?

  1. Đã đăng nhập vào máy tính để bàn gnome của tôi và truy cập gnome-terminal.
  2. Có hai tab trong nhà ga và trong một tôi tạo một người dùng được gọi là thử nghiệm mới và đăng nhập như thử nghiệm

    su - test 
    
  3. bắt đầu một kịch bản.

    cat test.sh 
    #!/bin/bash 
    sleep 60 
    printf "hello world!!" 
    exit 0 
    
    
    ./test.sh & 
    
  4. Sau đó tôi đăng xuất khỏi kiểm tra và đóng tab

  5. Trong tab sau tôi exected ps aux root và thấy công việc mà vẫn chạy.

Điều này đang xảy ra như thế nào?

+0

tôi nhận thấy rằng câu hỏi này vẫn chưa có một câu trả lời chấp nhận và rằng có một câu hỏi mới tương tự như trên [SU] mà có thể được đọc thú vị: [http: // superuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-the-shell-is-exited](http://superuser.com/questions/662431/what -exactly-defined-if-a-background-job-is-kill-khi-the-shell-is-exited) – Hennes

Trả lời

2

Chỉ vỏ tương tác mới có thể xóa công việc khi bạn đóng chúng. Các vỏ khác (ví dụ như các shell bạn nhận được bằng cách sử dụng su - username) không làm điều đó. Và các shell tương tác chỉ giết các tiến trình con trực tiếp.

+0

Bí quyết tương tự trên mac của tôi mà không có 'su'. – khachik

+0

Vỏ tương tác là gì? – Unni

+0

Trình bao tương tác là gì? http://tldp.org/LDP/abs/html/intandnonint.html nói rằng, nếu $ PS1 được đặt thì đó là một trình bao tương tác. Ngoài ra tôi chuyển sang một tty khác bằng cách sử dụng ctrl + alt + f2 và đăng nhập như thử nghiệm và thực hiện điều tương tự. kết quả là như nhau nhưng. – Unni

12

Việc các công việc nền đang chạy bị chấm dứt khi thoát tùy thuộc vào trình bao. Bash bình thường không làm điều này, nhưng có thể được cấu hình cho vỏ đăng nhập (shopt -s huponexit). Trong mọi trường hợp, truy cập vào tty là không thể sau khi quá trình kiểm soát (chẳng hạn như một vỏ đăng nhập) đã chấm dứt.

tình huống mà luôn gây SIGHUP bao gồm:

  • Bất cứ điều gì trong foreground khi tty được đóng cửa.
  • Bất kỳ công việc nào trong nền bao gồm các quy trình bị ngừng khi trình bao của họ kết thúc (SIGCONTSIGHUP). Shells thường cảnh báo bạn trước khi cho phép điều này xảy ra.

tóm tắt huponexit:

$ shopt -s huponexit; shopt | grep huponexit 
huponexit  on 
# Background jobs will be terminated with SIGHUP when shell exits 

$ shopt -u huponexit; shopt | grep huponexit 
huponexit  off 
# Background jobs will NOT be terminated with SIGHUP when shell exits 
+2

vì vậy bạn đang nói rằng, nếu tùy chọn huponexit không được đặt thì bash sẽ không giết các công việc nền của người dùng? – Unni

+0

@Unni - Nếu 'huponexit' được thiết lập, Bash sẽ gửi SIGHUP tới tất cả các công việc khi một trình bao đăng nhập tương tác thoát (với ** ** exit ** hoặc ** Ctrl + d **). –

Các vấn đề liên quan