Một số chương trình thường xuyên của tôi bị sập (trên cơ sở thường xuyên) với thông báo "Tín hiệu do người dùng xác định 1". Tôi biết có một nohuplệnh, nhưng có một nousr1lệnh? Hoặc một cái gì đó sẽ làm một cái gì đó như nohupnhưng với USR1?
Một số chương trình thường xuyên của tôi bị sập (trên cơ sở thường xuyên) với thông báo "Tín hiệu do người dùng xác định 1". Tôi biết có một nohuplệnh, nhưng có một nousr1lệnh? Hoặc một cái gì đó sẽ làm một cái gì đó như nohupnhưng với USR1?
Câu trả lời:
Một giải pháp hacky đơn giản để có tiện ích tương tự nohup, nhưng SIGUSR1, sẽ là lấy một bản sao của nguồn coreutils , giải nén nó, làm
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, tùy ý cũng thay đổi tên tệp đầu ra
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, biên dịch nguồn này và cài đặt nohupnhị phân mới được biên dịch thành /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Sau này, khi tôi kiểm tra, sleep 1000thoát ra USR1, trong khi nousr1 sleep 1000miễn nhiễm với tín hiệu này.
nohup, là tách rời quá trình từ thiết bị đầu cuối để nó không được gửi SIGHUPở nơi đầu tiên. Rằng nó cũng thiết lập một bộ xử lý tín hiệu là một phần thưởng bổ sung, nhưng không cần thiết.
signal(SIGHUP,SIG_IGN);cuộc gọi nohup.c, quá trình sẽ nhận được SIGHUP. Điều gì nohupngoài việc bỏ qua tín hiệu chỉ là mở lại các mô tả stdin, stdout, stderr như các tệp không đầu cuối. Nó không thực sự tách rời quá trình từ thiết bị đầu cuối theo bất kỳ cách đặc biệt nào. Tức là, quá trình sẽ được gửi SIGHUPkhi thiết bị đầu cuối bị treo. Mặt khác, bash, hoạt động tương tự với disownlệnh, nhưng tôi không chắc nó được thực thi như thế nào - có thể theo cách bạn muốn nói.
Làm thế nào về lệnh shell tích traphợp?
trap 'echo "Thou shalt not USR1 me"' USR1
Bạn cần sử dụng hình thức của traplệnh với một đối số trống. Thử đi:
trap '' SIGUSR1; myprogram
Điều này sẽ bỏ qua tín hiệu SIGUSR1, đó là những gì bạn đang cố gắng thực hiện. Mặc dù tôi đồng ý với các nhà bình luận rằng có lẽ có nhiều điều đang diễn ra ở đây hơn là bắt mắt.
Các hình thức không chính xác:
trap 'echo ...' SIGUSR1; myprogram
vẫn sẽ cho phép myprogramnhận SIGUSR1 nhưng shell sau đó sẽ thực thi lệnh echotừ traplệnh.
trap '' SIGUSR1; gvimdiff file1 file2và Vim chết với "Vim: Bị bắt tín hiệu chết người USR1".