Самый простой способ, который я могу придумать, это получить pid до того, как вы запустите процесс.
Например (в bash):
pidfile() { (
echo $BASHPID > "$1"
shift
exec "$@"
) }
mkfifo /var/run/out
while true
do
pidfile /tmp/cat.pid cat /var/run/out | pidfile /tmp/nc.pid nc -l 8080 > >(
while read line
do
do some stuff
done
)
done
Создается функция pidfile
, которая записывает текущий PID в указанный файл, а затем выполняет остальные аргументы, используя exec
. Функция exec
вызывает выполнение команды с тем же pid, что и оболочка, которая только что записала файл.
Обернем всю функцию pidfile()
в круглые скобки ()
, чтобы убедиться, что она выполняется в подоболочке. Ситуация, когда это становится критической, заключается в выполнении команды, которая не находится в процессе обработки. Например:
pidfile /tmp/foo some command here
Когда вы делаете это таким образом, pidfile()
будет выполняться в том же процессе, что и остальной скрипт, и поэтому, когда он вызывает exec
, выполняемая команда примет PID, и скрипт больше не будет выполняться.
Также обратите внимание, что все вышесказанное написано для bash. $BASHPID
является переменной, специфичной для bash. $$
не изменяется при использовании подоболочки, поэтому значение неверно для нашего использования.
Да, что-то должно запустить утилиту LVM (как вы говорите, vgchange-y
или аналогичный) в какой-то момент. Там нет магии, которая заставляет ядро рисуться тем сама собой.
В initramfs это обычно делается скриптом / init
(прямо или косвенно). Некоторые системы также сканируют для VG / LV всякий раз, когда UDEV
рассказывает о новом диске, но с DevTMPFS у вас тоже нет этой опции.
Итак, да, конечно, просто сделайте скрипт init для LVM и имейте каким-то образом систему INIT INING.