No servidor que está sempre conectado, estou usando isso em um crontab:
@reboot nc -k -l 1337 < /tmp/fifo.fifo
No cliente que nem sempre está na rede ou está ligado, estou usando este comando:
nc -d $IP_OF_SERVER 1337 > /tmp/fifo.fifo & $SOME_COMMAND
O servidor escuta sempre uma conexão na porta especificada (graças ao parâmetro -k), o cliente apenas se conecta ao servidor quando necessário.
Estou usando isso para o MPD e seu visualizador FIFO. O MPD é executado em um host remoto, mas meu cliente MPD (ncmpcpp) é executado localmente.
Esta é a parte importante da configuração do ncmpcpp no host local:
mpd_host = "$IP_OF_SERVER"
visualizer_fifo_path = "/tmp/fifo.fifo"
Esta é a parte importante da configuração do mpd no servidor remoto:
audio_output {
[…]
path "/tmp/fifo.fifo"
[…]
}
Executar o comando 'nc' em minha máquina local parece usar uma quantidade muito alta de recursos ... ~ 100% do desempenho da minha CPU.
Alguma ideia de qual é o problema? Ou se isso é normal e como eu iria melhorar todo esse cenário?
Infelizmente, não é possível especificar apenas um caminho de rede para visualizer_fifo_path, como:
visualizer_fifo_path = "$IP_OF_SERVER:/tmp/fifo.fifo"
E também não é possível montar o host remoto via NFS e usar o FIFO montado via NFS.
Veja alguns resultados de dtruss:
$ >> ps aux | grep 1337
user 96823 95,2 0,0 2433292 576 s003 R+ 12:16PM 37:27.77 nc -d 192.168.2.42 1337
user 96821 0,0 0,0 2447044 1084 s003 Ss+ 12:16PM 0:00.00 bash -c nc -d 192.168.2.42 1337 > /tmp/volumio.fifo & ncmpcpp -c /Users/user/.ncmpcpp/config-volumio -s visualizer
$ >> sudo dtruss -p 96821
SYSCALL(args) = return
$ >> sudo dtruss -p 96823
dtrace: 353433 dynamic variable drops with non-empty dirty list
SYSCALL(args) = return
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 2 0
read(0x3, "07N72756X6J63535142424644424_4L474v41454tmux split-window -t "$session":1 -v -p 28 "nc -d $IP_OF_SERVER 1337 > /tmp/volumio.fifo & ncmpcpp -c $HOME/.ncmpcpp/config-volumio -s visualizer"
6514\a52444345464k4z47353u313s30303133364^4h464P43353q35302420141'1g161\1b1711111@reboot nc -k -l 1337 < /tmp/fifo.fifo
", 0x400) = 1024 0
write(0x1, "07N72756X6J63535142424644424_4L474v41454nc -d $IP_OF_SERVER 1337 > /tmp/fifo.fifo & $SOME_COMMAND
6514\a524443454
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0
select(0x4, 0x7FFF5D031F90, 0x0, 0x0, 0x0) = 1 0
[…]
PS: Talvez o problema seja que 'nc' é iniciado em 'tmux' junto com 'ncmpcpp'…
mpd_host = "$IP_OF_SERVER"
visualizer_fifo_path = "/tmp/fifo.fifo"
Como eu executaria permanentemente 'nc -d $ IP_OF_SERVER 1337' em segundo plano, talvez também iniciado por um crontab? Existe algo como o parâmetro '-k' para se conectar a um servidor?
Tags performance cron netcat mpd fifo