Может быть более элегантный способ делать то, что вы хотите, но он работает:
do
(cat /var/run/out& echo $! > cat_pid; wait) |
(nc -l 8080 <&0 & echo $! > nc_pid; wait) > >(
︙
(разбиты на отдельные строки после |
для удобства чтения).
Это работает путем упаковки каждой команды, PID которой вы хотите, в подоболочку,
запускать его асинхронно в этой подоболочке, захватив его PID,
а затем ждем завершения команды.
(Это, по сути, возвращает команду на передний план.)
Используйте прием Скотта
чтобы асинхронный процесс в сценарии читал его законный стандартный ввод.
Но почему вы используете «кот» ?
И почему вы используете >> (…)
вместо простого трубопровода ?
Вы могли бы немного упростить это следующим образом:
while true do (nc -l 8080 < /var/run/out & echo $! > nc_pid; wait) | while read line do do some stuff done done
позволяя nc
читать прямо из / var / run / out
,
и использование простой трубы вместо замены процесса.
Я не уверен, что вы уже поняли это, но вы неправильно написали "strict sync" в вашем smb.conf (забыли 'c'). Кроме того, «синхронизировать всегда» не будет действовать, если строгая синхронизация не включена (чего не будет в этом случае из-за ошибки).