Терминал: запускать программу в фоновом режиме с идентификатором или указанным именем

Во-первых, вам вряд ли будет разрешен доступ к серверу 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, чем с машиной с некачественным. .

1
27.08.2017, 15:12
2 ответа

Краткий ответ: Вы не можете.

Средний ответ: Вне родительского процесса, который запустил ваш процесс PHP, вы не можете идентифицировать процесс со 100% надежностью.

Длинный ответ: Bash Process Management

Все сводится к тому, что на top, psи т. д. нельзя полагаться для окончательной идентификации процессов. запущен другим процессом. Процессы умирают неожиданно. PID перерабатываются. Имена процессов могут быть изменены.

Можно ли запустить все из одного долгоживущего демона/процесса? Это ваш лучший выбор. По крайней мере, родительский процесс хранит PID процесса PHP... хотя это не является надежным. Если вы готовы жить с риском того, что что-то пойдет не так, прочитайте эту страницу, чтобы узнать, как можно снизить риски.

(Конечно, тон этой страницы довольно жесткий, но целью этого сайта является правильность. Если вы не работаете с критически важной службой или чем-то, от чего зависят жизни людей, вы можете немного схитрить.)

Чтобы ответить на вторую часть, если у вас есть то, что вы считаете правильным PID, вы можете определить, работает ли он все еще с

kill -0 <PID> && echo 'The process is still running!'
1
27.01.2020, 23:33

Запустите скрипт напрямую, используя shebang(#!/usr/bin/phpв первой строке, и пометьте скрипт как исполняемый ). ps axпокажет имя скрипта в выводе, например. /usr/bin/php /path/to/your/script.

В качестве альтернативы вы можете сохранить PID в другом файле из вызывающего скрипта. Чтобы проверить, запущен ли ваш скрипт, проверьте, существует ли процесс с этим PID (. Возможно, вам также следует проверить соответствие cmdlineили exec, поскольку PID используются повторно ).

Как поясняется в ответе @B Layer , ни один из этих двух вариантов не является надежным на 100%.

1
27.01.2020, 23:33

Теги

Похожие вопросы