2011-10-23 23 views
8

Tôi có một kịch bản chạy trên nền của máy chủ Linux của tôi và tôi muốn bắt tín hiệu như khởi động lại hoặc bất cứ điều gì có thể giết chết kịch bản này và thay vào đó lưu bất kỳ thông tin quan trọng trước khi thực sự thoát.Làm cách nào để nhận tín hiệu KILL hoặc HUP hoặc Người dùng hủy?

Tôi nghĩ hầu hết những gì tôi cần bắt là SIGINT, SIGTERM, SIGHUP, SIGKILL.

Làm cách nào để nắm bắt bất kỳ tín hiệu nào trong số những tín hiệu này và thực hiện chức năng thoát nếu không tiếp tục thực hiện bất kỳ chức năng nào đang thực hiện?

pseudo code perl:

#!/usr/bin/perl 

use stricts; 
use warnings; 

while (true) 
{ 
    #my happy code is running 
    #my happy code will sleep for a few until its breath is back to keep running. 
} 

#ops I have detected an evil force trying to kill me 
#let's call the safe exit. 
sub safe_exit() 
{ 
    # save stuff 
    exit(1); 
} 

pseudo code php:

<?php 

while (1) 
{ 
    #my happy code is running 
    #my happy code will sleep for a few until its breath is back to keep running. 
} 

#ops I have detected an evil force trying to kill me 
#let's call the safe exit. 

function safe_exit() 
{ 
    # save stuff 
    exit(1); 
} 
?> 
+0

http://stackoverflow.com/questions/5180539/quick-perl-sigint-handler – daxim

Trả lời

15

PHP sử dụng pcntl_signal đăng ký một xử lý tín hiệu, do đó một cái gì đó như thế này:

declare(ticks = 1); 

function sig_handler($sig) { 
    switch($sig) { 
     case SIGINT: 
     # one branch for signal... 
    } 
} 

pcntl_signal(SIGINT, "sig_handler"); 
pcntl_signal(SIGTERM, "sig_handler"); 
pcntl_signal(SIGHUP, "sig_handler"); 
# Nothing for SIGKILL as it won't work and trying to will give you a warning. 
+0

sẽ thử nó nhờ ... vì vậy cơ bản nó sẽ được giao cho người xử lý và bắt ngay cả khi tôi có một vô hạn trong khi chạy một nơi nào đó trong mã phải không? – Prix

+0

@Prix: Vâng, điều đó sẽ xảy ra. Nhưng chú ý đến ghi chú của ikegami trên SIGKILL và đọc tài liệu (http://php.net/manual/en/function.pcntl-signal.php) để biết thêm thông tin. –

+0

'# Chỉ cần cho hiển thị, bạn sẽ không bắt được điều này.' không chỉ vậy nhưng bạn vẫn nhận được một thông báo cảnh báo về nó khi chạy mã. Phần còn lại hoạt động khá tốt nhờ. – Prix

1

Đối với phiên bản perl, xem perldoc -q signal - về cơ bản, thiết lập $SIG{signal} đến một tài liệu tham khảo tiểu.

+1

'perldoc perlvar' sẽ là một tham chiếu tốt khác: http://perldoc.perl.org/perlvar.html# % 25SIG –

+0

Ồ, đúng vậy. Tôi hoàn toàn bị rối loạn về điều đó. –

+0

'perldoc -q signal' không cho tôi biết enouch để biết cách liệt kê các tùy chọn sẽ được sử dụng và như vậy câu trả lời của bạn không giúp tôi nhiều, nhưng dù sao đi nữa. @mu quá ngắn Các liên kết tham chiếu bạn đăng là tuyệt vời, không hiển thị tất cả những gì ở trên không. – Prix

5

Perl:

@SIG{qw(INT TERM HUP)} = \&safe_exit; 

SIGKILL không thể bị bắt. Nó không được gửi đến tiến trình.

%SIG được ghi lại trong perlvar. Xem thêm perlipc

+0

Có vẻ tốt nhưng có 'kill -9 pid' rơi vào INT hay SIGKILL? Tôi chủ yếu sử dụng kill -HUP để hoàn thành quá trình và từ những gì tôi biết khởi động lại gửi một tín hiệu TERM nhưng muốn được an toàn chống lại bất cứ ai khác cố gắng để giết nó. – Prix

+3

@Prix: 9 là SIGKILL. Hãy thử 'kill -l' nếu bạn đang sử dụng bash, điều đó sẽ cho bạn một danh sách các tín hiệu cùng với số của chúng. Ctrl + C là SIGINT. –

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