Không có, có lệnh nousr1 không?


12

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?


3
Câu hỏi tốt hơn có thể là điều gì đang gửi tín hiệu usr1 ở vị trí đầu tiên? Nếu không có gì, thông báo thoát có thể đơn giản là sai lệch.
Cấp

2
Âm thanh như bạn có thể có một số vấn đề nghiêm trọng trong "chương trình thông thường" của bạn ... chỉ đơn giản là vô hiệu hóa tín hiệu có thể không sửa hoặc cho phép các ứng dụng cơ bản hoạt động đúng. Tôi thực sự khuyên bạn nên kiểm tra môi trường của mình CẨN THẬN trước khi vô hiệu hóa mọi thứ.
mdpc

@Grant: Tôi đồng ý. Có một tiện ích có thể cho tôi biết những gì đang gửi những tín hiệu này?
dùng2624632

Câu trả lời:


3

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.


Nhân tiện, chức năng chính của 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.
Simon Richter

@SimonRichter Nếu bạn loại bỏ 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 được thực thi như thế nào - có thể theo cách bạn muốn nói.
Ruslan

Điều này dường như làm việc tốt.
dùng2624632

8

Làm thế nào về lệnh shell tích traphợp?

trap 'echo "Thou shalt not USR1 me"' USR1 

Ý tưởng tốt, nhưng nó đã không làm việc. Quá trình thoát dù sao với "Tín hiệu do người dùng xác định 1".
dùng2624632

Trình xử lý tín hiệu (trừ SIG_IGN và SIG_DFL) không được kế thừa bởi các tiến trình con.
xe đẩy

2

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.


Điều này dường như làm việc tốt.
dùng2624632

Rất tiếc, tôi đã nói quá sớm. Tôi đang chạy trap '' SIGUSR1; gvimdiff file1 file2và Vim chết với "Vim: Bị bắt tín hiệu chết người USR1".
dùng2624632

Hmmm, nhìn vào mã nguồn tại code.google.com/p/vim/source/browse/src/os_unix.c có vẻ như VIM kích hoạt lại tín hiệu USR1 và coi đó là lỗi nghiêm trọng. Hy vọng duy nhất của bạn dường như là nếu bạn có thể khiến HĐH từ chối phát tín hiệu USR1. Tôi không biết nếu có một cái gì đó có thể cung cấp chức năng đó.
Adrian Pronk

Thêm thông tin tại đây: stackoverflow.com/q/4515274/41861
Adrian Pronk

Adrian Pronk: không chỉ Vim; đó cũng là Firefox, Aqualung và Thunderbird và một số người khác. Nhưng không phải các ứng dụng khác, chẳng hạn như Konsole, chạy mãi mãi.
dùng2624632
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.