Có nhiều trường hợp khi sự khác biệt nhỏ giữa các môi trường có thể cắn bạn. Đây là một trong đó tôi đã chạy gần đây. Sự khác biệt giữa hai lệnh này là gì?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
Câu trả lời giống như bình thường - nó phụ thuộc.
nohup bắt tín hiệu gác máy trong khi ampersand thì không.
Tín hiệu gác máy là gì?
SIGHUP - hangup được phát hiện trên thiết bị đầu cuối kiểm soát hoặc tử vong của quá trình kiểm soát (giá trị: 1).
Thông thường, khi chạy lệnh bằng cách sử dụng & thoát khỏi shell sau đó, shell sẽ chấm dứt lệnh phụ với tín hiệu gác máy (như kill -SIGHUP $ PID). Điều này có thể được ngăn chặn bằng cách sử dụng nohup, vì nó bắt được tín hiệu và bỏ qua nó để nó không bao giờ đến được ứng dụng thực tế.
Tốt, nhưng như trong trường hợp này luôn có "buts". Không có sự khác biệt giữa các phương thức khởi chạy này khi shell được cấu hình theo cách mà nó hoàn toàn không gửi SIGHUP.
Trong trường hợp bạn đang sử dụng bash, bạn có thể sử dụng lệnh được chỉ định bên dưới để tìm hiểu xem trình bao của bạn có gửi SIGHUP tới các tiến trình con của nó hay không:
~ $ shopt | grep hupon
Và hơn nữa - có những trường hợp nohup không hoạt động. Ví dụ: khi quá trình bạn bắt đầu kết nối lại tín hiệu NOHUP (nó được thực hiện bên trong, ở cấp mã ứng dụng).
Trong trường hợp được mô tả, thiếu khác biệt với tôi khi bên trong tập lệnh khởi chạy dịch vụ tùy chỉnh, có một lệnh gọi đến tập lệnh thứ hai để thiết lập và khởi chạy ứng dụng phù hợp mà không cần lệnh nohup.
Trên một môi trường Linux, mọi thứ đều hoạt động trơn tru, ở lần thứ hai, ứng dụng thoát ngay khi tập lệnh thứ hai thoát ra (phát hiện trường hợp đó, tất nhiên tôi phải mất nhiều thời gian hơn thì bạn có thể nghĩ: bị mắc kẹt :).
Sau khi thêm nohup làm phương thức khởi chạy vào tập lệnh thứ hai, ứng dụng sẽ tiếp tục chạy ngay cả khi tập lệnh sẽ thoát và hành vi này trở nên nhất quán trên cả hai môi trường.