Во-первых, вам вряд ли будет разрешен доступ к серверу Stratum 1 , если вы не известны администраторам сервера Stratum 1 и они не дали вам явного разрешения на это. Сказав это, то, что это за слой сервера, не имеет значения для этого ответа, поэтому для ясности я буду называть эту машину сервером "low-stratum".
Вы должны настроить server2
так, чтобы время получалось с нижнего уровня сервера, а не с server1
. Для этого потребуется, чтобы у него была возможность (по крайней мере, для NTP) получить доступ к Интернет-ссылке на server1
. Если server2
не имеет ссылки на Интернет, с помощью которой он мог бы получить доступ к низкоуровневому серверу, то вы можете разрешить ему это, выполнив следующие команды на server1
] (как root):
iptables -A FORWARD -s server2 -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -s server2 -p tcp --dport 123 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sysctl -w net.ipv4.ip_forward=1
Первые две строки разрешают трафик NTP только с хоста server2
. Примечание: я не на 100% уверен, что TCP-соединения требуются, но это не должно повредить. Вы также можете добавить -d lowstratumserver
к этим двум строкам, чтобы эта машина не могла получить доступ ни к какому другому серверу (только к низкоуровневому). Следующая строка разрешает обратный трафик от установленных подключений. Четвертая строка включает трансляцию сетевых адресов. Последняя строка включает пересылку IP-пакетов. С ними server1
теперь является (минимальным) маршрутизатором.
Если server2
не имеет server1
в качестве маршрутизатора по умолчанию, вам также потребуется добавить явный маршрут для низкоуровневого сервера:
ip route add lowstratumserver via server1
При этом server2
будет использовать server1
в качестве своего маршрутизатора для сетевого подключения к lowstratumserver
и свой обычный маршрутизатор для всего остального.
Затем настройте server2
для использования низкоуровневого сервера в Интернете в качестве источника NTP, а не server1
.
Наконец, настройте server1
так, чтобы он подключался к server2
, а не к серверу Stratum 1 в Интернете.
Теперь server2
синхронизируется с нижним слоем сервера в Интернете, а не с server1
; и server1
всегда будет синхронизироваться с server2
, избавившись от необходимости добавлять настройку аварийного переключения (которая в лучшем случае будет хрупкой).
Это немного потеряет точность из-за дополнительного перехода, но всегда лучше синхронизировать машины в вашей локальной сети с машиной с хорошим аппаратным RTC, чем с машиной с некачественным. .
Краткий ответ: Вы не можете.
Средний ответ: Вне родительского процесса, который запустил ваш процесс PHP, вы не можете идентифицировать процесс со 100% надежностью.
Длинный ответ: Bash Process Management
Все сводится к тому, что на top
, ps
и т. д. нельзя полагаться для окончательной идентификации процессов. запущен другим процессом. Процессы умирают неожиданно. PID перерабатываются. Имена процессов могут быть изменены.
Можно ли запустить все из одного долгоживущего демона/процесса? Это ваш лучший выбор. По крайней мере, родительский процесс хранит PID процесса PHP... хотя это не является надежным. Если вы готовы жить с риском того, что что-то пойдет не так, прочитайте эту страницу, чтобы узнать, как можно снизить риски.
(Конечно, тон этой страницы довольно жесткий, но целью этого сайта является правильность. Если вы не работаете с критически важной службой или чем-то, от чего зависят жизни людей, вы можете немного схитрить.)
Чтобы ответить на вторую часть, если у вас есть то, что вы считаете правильным PID, вы можете определить, работает ли он все еще с
kill -0 <PID> && echo 'The process is still running!'
Запустите скрипт напрямую, используя shebang(#!/usr/bin/php
в первой строке, и пометьте скрипт как исполняемый ). ps ax
покажет имя скрипта в выводе, например. /usr/bin/php /path/to/your/script
.
В качестве альтернативы вы можете сохранить PID в другом файле из вызывающего скрипта. Чтобы проверить, запущен ли ваш скрипт, проверьте, существует ли процесс с этим PID (. Возможно, вам также следует проверить соответствие cmdline
или exec
, поскольку PID используются повторно ).
Как поясняется в ответе @B Layer , ни один из этих двух вариантов не является надежным на 100%.