Знание должно быть доступно!

Путь /ОС/FreeBSD

===================================================

=  📜 КАК НАСТРОИТЬ RC.D СКРИПТ ДЛЯ DEMON В JAIL  =

= С ПРАВИЛЬНЫМ STATUS: ORK-ГАЙД V1 = =================================================== [🏗️] ЦЕЛЬ: Сделать `rc.d`-скрипт для FreeBSD (в том числе в jail), который правильно: - запускает сервис (через `/usr/sbin/daemon`) - пишет `pidfile` - даёт рабочий `service status`

      

[📦] ПРОБЛЕМА:

  
    
    
``- ⇒ `status` не работает: пишет `not running`, даже если процесс жив  [⚔️] СИМПТОМЫ: ```sh   service synapse start   # → Starting synapse.    service synapse status   # → synapse is not running.    sockstat -l | grep :8008   # → порт слушается    cat /var/run/synapse.pid   # → PID существует, процесс жив    ps -aux | grep $PID   # → процесс есть, но status врёт``

[🧠] ПРИЧИНА:
  По умолчанию rc.subr использует:

`basename $command → procname`

  Если ты указал:

`command="/usr/sbin/daemon"`

    то rc.subr ищет процесс daemon, а не python — и не находит.

[🔧] РЕШЕНИЕ:
  Указать правильный procname, соответствующий реальному дочернему процессу, а не daemon.

[✅] ПРАВИЛЬНЫЙ СКРИПТ:

#!/bin/sh # # PROVIDE: synapse # REQUIRE: NETWORKING # KEYWORD: shutdown . /etc/rc.subr name="synapse" rcvar="synapse_enable" pidfile="/var/run/${name}.pid" logfile="/var/log/${name}.log" procname="/opt/synapse/bin/python" command="/usr/sbin/daemon" command_args="-p ${pidfile} -o ${logfile} -t ${name} ${procname} -m synapse.app.homeserver --config-path /opt/synapse/homeserver.yaml" load_rc_config $name : ${synapse_enable="NO"} run_rc_command "$1"

[🧪] ПРОВЕРКА:

sysrc synapse_enable=YES service synapse start service synapse status # → synapse is running as pid XXXX service synapse stop

[📂] ПОД КАПОТОМ:
rc.subr при вызове status делает:

ps -p $PID -o ucomm= # сравнивает с $procname

→ если не совпадает, пишет not running, даже если PID жив.

[📛] ЕСЛИ НЕ ПОМОГЛО:

  • Проверь доступность /var/run/ изнутри jail

  • Убедись, что kill -0 $(cat $pidfile) работает

  • Убедись, что ps -p $PID показывает нужный процесс

  • В крайнем случае: используй nohup, &, echo $! > $pidfile вручную без daemon, но это жопэ с повисшим out и не закрытым service, застопорти к чертям всё.

[🔥] ВЫВОД:
Для любых дочерних процессов (например, Python, Node.js, Go):

  • Если запускаешь через daemonвсегда задавай procname, соответствующий исполняемому бинарю.

  • Это ключ к рабочему service status и stop.

🐗 Живи по уставу орк-хакеров: всё под контролем, всё чётко, без фокусов.

Слава демонам, которых видно!