Quente para escrever um EOF em um arquivo, para parar qualquer processo de rejeito

2

Eu tenho vários processos seguindo um arquivo, como posso escrever um EOF para o arquivo, para parar os processos finais?

por exemplo,

tail -F $HOME/somefile.log

que está sendo executado em algum terminal em algum lugar, não tenho certeza onde. Como posso escrever um EOF para o arquivo de log, para que qualquer processo que esteja seguindo esse arquivo pare de usá-lo?

Em alguns casos, estou seguindo um fifo:

mkfifo fivel
tail -f fivel

Acredito que escrever um EOF em um pipe nomeado pode realmente interromper / eliminar qualquer processo que esteja seguindo o fifo, enquanto escrever um EOF em um arquivo regular pode não parar os processos finais.

    
por Alexander Mills 10.07.2017 / 00:45

2 respostas

1

Para mim isso não parece ser o caminho certo para conseguir isso. Eu acho que você quer direcionar o processo final [es] lendo o arquivo em vez do próprio arquivo. Considere algo como o seguinte em seu lugar.

ps -ef | grep "[t]ail" | grep 'somefile.log' | tr -s ' ' | cut -d' ' -f2 | xargs kill
  1. ps -ef exibirá todos os processos em execução no seu sistema.
  2. grep "[t]ail" irá encontrar todos os processos com cauda no nome (excluindo este grep).
  3. grep 'somefile.log' encontrará a partir desses arquivos com somefile.log no nome.
  4. tr -s ' ' irá espremer todos os múltiplos espaços para um.
  5. cut -d' ' -f2 usará espaço como delimitador obterá apenas a segunda coluna que é o PID.
  6. xargs kill irá matar esse PID.

Isso eliminará qualquer processo final de leitura do arquivo (barra alguns casos estranhos de canto, por exemplo, arquivo de log chamado tailsomefile.log). Pode haver uma maneira mais limpa de fazer isso, mas esta foi a primeira solução imediatamente óbvia para mim. Eu testei que isso está funcionando no Linux.

    
por 10.07.2017 / 02:04
2

O comando tail não sai no EOF quando executado com -f em um arquivo regular. Espera explicitamente por mais dados. Então, já existe um EOF no final do seu arquivo - ele simplesmente não faz com que o final saia porque ele não deveria fazer isso.

A única maneira é matar a cauda. Executar

ps ax|grep tail

e, em seguida, elimine o ID do processo que aparece no processo final da instalação. Como alternativa, use

pkill tail

para matar todos os processos finais. Use isso com cuidado, pois você pode matar processos que não deseja matar.

    
por 10.07.2017 / 09:49

Tags