Как в Synology DSM4 проверить при запуске PHP скрипта, не был ли он запущен ранее?

Собственно элементарная ситуация, которая конечно не может случиться если у вас есть стабильный источник электроэнергии, который держит ваш NAS длительное время, или же ваш NAS имеет anacron, с которым вы умеете к тому же обращаться.

Представьте себе, что длительно работающий пхп-скрипт, который выполняет ФТП бекапы, выключается. По неизвестным причинам. Собственно, в таком случае , при наступлении определенного времени cron опять запустит задачу, и все вернеться на круги своя.

Но если вы привыкли экономить время, и понимаете, что любой простой станции чреват, например, тем что пропущенный бекап, приведет к потере данных. вы понимаете, что стоит сделать процесс выполнения заданий постоянным.

Для  программиста проще всего обеспечить такое постоянство работы опять же программным путем. Следующий кусок кода демонстрирует каким образом в пхп скрипте, который выполняется на DSM Линуксе отследить не был ли ранее запущен текущий скрипт . Ели был запущен и выполняется,  — прекратить выполнне, и выйти.

$task_name  = basename(__FILE__);
exec( "ps|fgrep php", $psl);
preg_match_all(
    "~\d+\s+root\s+\d+\s+S\s+/usr/bin/php \-q /.+?/".preg_quote($task_name)."~msi",
    implode("\n",$psl) ,
    $vv,
    PREG_SET_ORDER
);
if ( count( $vv)>1 )
  exit;

 

Понятно, что это должно быть в самом начале скрипта перед всеми дальнейшими действиями.
Обратите внимание — «смотрится» уникальность имени файла, а не всего полного пути и имени.
В случае если вы хотите запустить некий скрипт, из двух папок, следует доработать код, чтобы проверялся полный путь.
Однако если у вас все имена уникальны, такая доработка не понадобиться.

Собственно после того, как вы вставили такую проверку на уникальность, можно указывать время жизни скритпа например в 24 часа, и выставлять ежеминутный его запуск в «кронтабе». Лишних копий не будет запущено, точнее они будут запущены, но тут же «умрут».

По пути выполнения «killall» я в данном скрипте не пошел. Так как текущий скрипт также был бы убит данной командой. Поэтому приходиться считать количество запущенных процессов (ps|fgrep php). Если оно более одного (текущего), то в системе уже выполняется такой скрипт, то есть следует «выйти».

Надеюсь данный пример пригодится пользователям Synology DSM4. У меня он регулярно выполняется на DS212 с последними обновлениями. На момент написания статьи работа — стабильна.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *