これ↓の PHP 版です。
<?php
function single()
{
static $fp;
$fp = fopen(__FILE__, "r");
if (is_resource($fp) == false)
{
throw new \RuntimeException("unable open self");
}
$wouldBlock = false;
if (flock($fp, LOCK_EX|LOCK_NB, $wouldBlock) == false)
{
if ($wouldBlock)
{
return false;
}
throw new \RuntimeException("unable lock self");
}
return true;
}
if (single() == false)
{
echo "process is running.\n";
exit();
}
$pid = getmypid();
echo "pid $pid\n";
echo "wait 10 sec ";
for ($i=0; $i<10; $i++)
{
sleep(1);
echo ".";
}
echo "\n";
この方法なら後処理のことはなにも考えなくてもカーネルがよきに計らってくれます。kill -KILL $pid
で殺されても大丈夫です。