2011年1月28日 星期五

[引用]PHP: pcntl_signal

PHP: pcntl_signal - Manual
Note: Currently, this module will not function on non-Unix platforms (Windows).
來源

<?php
// tick use required as of PHP 4.3.0
declare(ticks = 1);

function sig_handler($signo) // signal handler function
{
switch ($signo)
{
case SIGTERM: // handle shutdown tasks, kill, kill -15
print "SIGTERM\n";
break;
case SIGHUP: // handle restart tasks, kill -1
print "SIGHUP\n";
break;
case SIGUSR1:
print "SIGUSR1\n";
break;
case SIGINT: // ctrl + c
print "SIGINT\n";
break;
default: // handle all other signals
print "Other:$signo\n";
}
}

echo "Installing signal handler...\n";

// setup signal handlers
pcntl_signal( SIGTERM , "sig_handler" ); // kill or kill -15
pcntl_signal( SIGHUP , "sig_handler" ); // kill -1
pcntl_signal( SIGUSR1 , "sig_handler" ); // self
pcntl_signal( SIGINT , "sig_handler" ); // ctrl+c

//echo"Generating signal SIGTERM to self...\n";

while( 1 )
{
echo ".";
sleep( 1 );
}

// send SIGUSR1 to current process id
//posix_kill(posix_getpid(), SIGUSR1);

echo "Done\n"

?>

執行前需留意,上述程式已經擷取 ctrl+c 的訊號,在 Unix 環境中,需使用 kill -9 的訊號來終止他:

$ php t.php

接著在 Unix 上可以用 pa aux | grep 'php t.php' 查看剛剛那隻的 pid,接著可以用 kill 指令去操控他囉!

簡單用 awk 處理,可自行把 system( "kill " $2 ) 更新為 system( "kill -9 " $2 ) 等模式

$ ps aux | grep 'php t.php' | awk 'match( $11,"php" ) && match( $12 , "t.php" ) {system( "kill " $2 )}'

依序用 Ctrl+C , kill -1, kill -15, kill -9 的訊號

$ php t.php
Installing signal handler...
....^CSIGINT
.....SIGHUP
....SIGTERM
...已砍掉

【下列文章您可能也有興趣】

沒有留言: