之前用 PHP 寫了一些 tools level 的程式,也就是使用上都是透過 $ php t.php 的模式在進行,最近想替他加上 Signal 的處理,如此一來可以增加一些資料的正確性。
參考資料:
- PHP: pcntl_signal - Manual
Note: Currently, this module will not function on non-Unix platforms
(Windows).
範例程式(小部份的修改 Example #1 pcntl_signal() example):
@ t.php
<?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
...已砍掉
沒有留言:
張貼留言