Aşağıdaki örnekte pcntl_signal fonksiyonunu kullanarak, çalışan komutumuzun yaptığı işi bitirmesini bekledikten sonra işlemi sonlandıracağız. Bu ctrl+c aksiyonu ve kill PID komutu ile beklenmedik bir şekilde gelen işlem sonlandırma isteklerini kontrol altına almak için kullanılır. Symfony komutunu örnek olarak kullanacağız.


Komut


Ben ekrana sadece bir mesaj yazacağım ama siz veritabanı bağlantısını kapatabilir, verileri kaydedebilir, dosyaları kapatabilir, log tutabilirsiniz vs.


namespace AppBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloCommand extends Command
{
/** @var OutputInterface */
private $output;

protected function configure()
{
$this->setName('hello');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$this->output = $output;

declare(ticks = 1);

pcntl_signal(SIGINT, [$this, 'doInterrupt']);
pcntl_signal(SIGTERM, [$this, 'doTerminate']);

while (true) {
$output->writeln('Hello '.date('s'));

sleep(1);
}
}

/**
* Ctrl-C
*/
private function doInterrupt()
{
$this->output->writeln('Interruption signal received.');

exit;
}

/**
* kill PID
*/
private function doTerminate()
{
$this->output->writeln('Termination signal received.');

exit;
}
}

kill PID test


$ bin/console hello
Hello 36
Hello 37
Hello 38
Hello 39
Termination signal received.

CTRL+C test


$ bin/console hello
Hello 17
Hello 18
Hello 19
^C
Interruption signal received.