Você pode executar o script bash em segundo plano usando a tela.
Por favor, confira os seguintes artigos sobre ele.
Você pode usar monit para manter o comando em execução. Ele será iniciado se o serviço falhar.
Eu preciso de um script pequeno que execute três comandos vlc ao mesmo tempo (no servidor Ubuntu 14.04) conforme indicado abaixo:
#!/bin/sh
cvlc -vvv v1 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5656,access=http}"
cvlc -vvv v2 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5657,access=http}"
cvlc -vvv v3 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5658,access=http}"
Eu preciso da maneira ou método perfeito para que o script execute 3 comandos do VLC (todos os comandos devem estar rodando no mesmo tempo e silenciosamente no back ground).
Também é necessário outro script para verificar se o script acima está em execução (todo o comando vlc no script acima está em execução) se foi interrompido ou travado para reiniciá-lo.
Obrigado antecipadamente
Shata
Que tal experimentar: nohup seu-comando &
"nohup" garante que o processo não será encerrado após o logout e "&" no final garante que todo o comando será executado em segundo plano.
A maneira usual de enviar em segundo plano um processo é usar o operador &
após o seu comando (como sugerido por Glenn).
Para ter a possibilidade de individualizar o status do processo depois de algum tempo, você precisa conhecer seu PID. Portanto, você precisa encontrar uma maneira de capturar o PID
(ID do processo) do processo recém-lançado.
Está disponível na variável $!
.
Note que você precisa armazená-lo em outra variável porque ele será atualizado após cada chamada de comando. Nesse caso, você pode armazenar o PID em um arquivo que pode ser usado posteriormente com um segundo script .
Um bom lugar para armazená-lo parece ser /var/lock/yourscripdirectory/lock
.
Em cada reinicialização, esse diretório deve ser limpo automaticamente.
Seu primeiro script (vamos chamá-lo de s1.sh
) deve executar seus comandos e armazenar os PIDs e pode ser semelhante ao abaixo:
#!/bin/sh
MyLockDir="/var/lock/${0##*/}"
mkdir -P # it creates if needed the directory
# /var/lock/yourscriptname without its path
cvlc -vvv v1 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5656,access=http}" &
echo $! >${MyLockDir}/5656 # here you store in the file 5656 the PID
cvlc -vvv v2 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5657,access=http}" &
echo $! >${MyLockDir}/5657
cvlc -vvv v3 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:5658,access=http}" &
echo $! >${MyLockDir}/5658
Um segundo script (vamos chamar s2.sh
) tem que verificar se o processo com o PID
foi escrito no arquivo criado anteriormente. Deve checj se ainda estiver em execução e atualizá-lo, se necessário. Veja algumas dicas das linhas abaixo:
#!/bin/sh
MyPort=$2
MyLockDir="/var/lock/s1.sh"
mypid="$(cat ${MyLockDir}/${MyPort})"
ps -p $mypid > /dev/null;
if [ $? == 0 ] ;
then # Running
echo "# It runs ... " ; # or whatever you want
else # NOT Running
cvlc -vvv $1 --sout "#transcode{vcodec=h264,vb=999,acodec=mp3,ab=128,deinterlace channels=2,samplerate=44100}:standard{mux=ts,dst=x.x.x.x:$MyPort,access=http}" &
echo $! >${MyLockDir}/$MyPort
fi
por exemplo. você pode executar o segundo script com ./s2.sh v1 5656
(ou com ./s2.sh v2 5657
...) para cada porta que precisar.
Uma maneira um pouco mais complexa é criar para cada porta um diretório com esse nome em seu LockDir e colocar o arquivo de bloqueio com o PID dentro dele, interceptar um comando remove para o diretório em o script em si e verifique mais tarde se o diretório existe ... veja dicas aqui
Dessa forma, você terá a garantia de que apenas um script concorrente pode criá-lo e executar uma cvlc
instance nessa porta.
UPDATE: Um comentário
P: Por que sugerir armazenar o PID em vez disso, para verificá-lo com outros comandos como ps -ef | grep '5657'
?.
R: Em geral o PID de um processo é único, entretanto você não pode saber de antemão se a string que está usando para grep
a ps
output não é usada por outro comando ... o PID existe por esse motivo :)