В хорошей программе демона можно предусмотреть проверку наличия этого файла во время запуска и отказ от работы, если он уже существует, поскольку наличие этого файла может указывать на то, что уже запущен другой экземпляр сервера. Еще более развитые программы демонов проверяют, действительно ли работает процесс на который указывает этот файл PID. Возможно, что предыдущий сеанс работы сервера завершился аварией или был уничтожен, поэтому серверная программа не имела возможности удалить этот файл. Такое решение реализовано в подпрограмм openjpid_file (), приведенной ниже.
Подпрограмма openjpid_fiie ()
sub open_pid_file { my $ file = shift; if (-e $file) { # Ошибка. Файл pid уже существует my $fh = IO::File->new ($file) | | return; my $pid = <$fh>; die "Server .already running with Pid $pid" if kill 0 => $pid; warn "Removing PID file for defunct server process $pid.n"; die "Can’t unlink PID file $file" unless -w $file && unlink $file; } return IO::File->new($file, O_WR0NLY | O_CREAT | O_EXCL, 0644) or die. "Can't create $file: $!n"; }
Проведем анализ программы.
Строки 1-3. Проверка того, существует ли старый файл PID. Подпрограмма open_pid_file () вызывается с параметром, который указывает путь к файлу PID. Первое действие состоит в применении опции файловой проверки -е к этому файлу для определения того, существует ли он.
Строки 4-6. Проверка того, является ли старый файл PID действительным. Если файл PID существует, можно перейти к проверке того, работает ли еще процесс, на который он указывает. Для открытия старого файла PID и чтения из него числового идентификатора процесса применяется модуль IO::File. Для определения того, работает ли еще этот процесс, используется функция kill (), которая отправляет процессу сигнал с номером 0.