Tl; dr:
Tại sao sleepquá trình có thể tồn tại khi tôi đăng xuất và thiết bị đầu cuối bị đóng? Trong tâm trí của tôi, tất cả mọi thứ trừ daemon và nohupchương trình sẽ bị giết trong quá trình đăng xuất. Nếu sleepcó thể tồn tại theo cách này, điều đó có nghĩa là tôi có thể sử dụng phương pháp này thay vì nohuplệnh?
Trừ khi bashcá thể được sinh ra bởi sshcó huponexittùy chọn được đặt, sẽ không có quá trình nào bị chấm dứt bởi bất kỳ phương tiện nào khi thoát / đăng xuất và khi huponexittùy chọn được đặt, sử dụng kill -9trên shell không phải là cách thay thế tốt cho việc sử dụng nohuptrên các tiến trình con của shell; nohuptrên các quy trình con của shell vẫn sẽ bảo vệ chúng khỏi SIGHUP không xuất phát từ shell và ngay cả khi điều đó không quan trọng nohupvẫn được ưu tiên vì nó cho phép shell được kết thúc một cách duyên dáng.
Trong bashđó có một tùy chọn được gọi huponexit, nếu được đặt sẽ tạo bashSIGHUP con của nó khi thoát / đăng xuất;
Trong các bash trường hợp không đăng nhập tương tác , chẳng hạn như trong một bashtrường hợp được sinh ra bởi gnome-terminal, tùy chọn này bị bỏ qua; dù huponexitđược đặt hay không được đặt, bashtrẻ em sẽ không bao giờ bị SIGHUPped bashkhi thoát;
Trong các trường hợp đăng nhập tương tác bash, chẳng hạn như trong một bashtrường hợp được sinh ra bởi ssh, tùy chọn này không bị bỏ qua (tuy nhiên nó không được đặt theo mặc định); nếu huponexitđược đặt, bashcon cái sẽ bị SIGHUPped bashkhi thoát / đăng xuất; nếu không huponexitđược đặt, bashtrẻ em sẽ không bị SIGHUPped bashkhi thoát / đăng xuất;
Vì vậy, trong việc thoát / đăng xuất chung từ một bashcá thể đăng nhập tương tác , trừ khi huponexittùy chọn được đặt, sẽ không tạo vỏ SIGHUP con của nó và thoát / đăng xuất khỏi một bashcá thể không đăng nhập tương tác sẽ không tạo vỏ SIGHUP con của nó bất kể;
Tuy nhiên, điều này không liên quan trong trường hợp này: sử dụng kill -9 sleepsẽ tồn tại bất kể vì việc giết tiến trình cha mẹ của nó ( bash) sẽ không để lại cơ hội cho người sau làm bất cứ điều gì với ví dụ trước (ví dụ: nếu bashtrường hợp hiện tại là bashtrường hợp đăng nhập và huponexittùy chọn đã được đặt, thành SIGHUP nó).
Thêm vào đó, không giống như các tín hiệu khác (như tín hiệu SIGHUP được gửi đến bash), tín hiệu SIGKILL không bao giờ được truyền đến các tiến trình con của quy trình, do đó sleepthậm chí không bị giết;
nohupbắt đầu một quá trình miễn dịch với các tín hiệu SIGHUP, một cái gì đó khác biệt; nó sẽ ngăn quá trình treo lên khi nhận tín hiệu SIGHUP, trong trường hợp này có thể nhận được bằng thể hiện đăng nhập tương tác bashtrong trường hợp huponexittùy chọn được đặt và thoát vỏ; Vì vậy, về mặt kỹ thuật sử dụng nohupđể bắt đầu một quy trình trong bashtrường hợp đăng nhập tương tác với huponexittùy chọn không được đặt sẽ ngăn quá trình treo lên khi nhận tín hiệu SIGHUP, nhưng việc thoát / đăng xuất khỏi vỏ sẽ không SIGHUP bất kể;
Tuy nhiên, nói chung, khi nohupcần thiết để ngăn chặn tín hiệu SIGHUP đến từ vỏ cha, không có lý do nào để thích kill -9phương thức cha mẹ hơn phương thức nohupcon; thay vào đó, nó phải ngược lại.
Giết cha mẹ bằng kill -9phương pháp không để cho cha mẹ thoát ra một cách duyên dáng, trong khi bắt đầu con sử dụng nohupphương thức này cho phép cha mẹ bị chấm dứt bởi các tín hiệu khác, chẳng hạn như SIGHUP (để làm ví dụ có ý nghĩa trong ngữ cảnh của một đứa trẻ bắt đầu sử dụng nohup), cho phép nó thoát ra một cách duyên dáng.
&sẽ rẽ nhánh quá trình sang nền (như daemon) và tiếp tục chạy cho đến khi bạn đăng xuất.