Eu tenho um arquivo de texto no meu diretório pessoal que recebe dados regularmente através de um trabalho cron. Como o trabalho cron fornece dados dinâmicos, eu também gostaria de definir um trabalho cron para esvaziar o conteúdo do arquivo (o arquivo ainda deve existir). Não preciso de ajuda com o cron, apenas o comando que pode ajudar no esvaziamento do arquivo.
command-line
sosytee
fonte
fonte
tail -n +1000 file.txt > file.txt
remova 1000 linhas e mantenha as linhas mais recentes no arquivo (você nunca sabe quando poderá precisar de parte do registro recente para rastrear algo).Respostas:
A maneira mais simples:
Essa é uma maneira menos óbvia e provavelmente menos legível em outros scripts de shell, mas é tudo que você precisa.
Porque
>
na verdade não é realmente um comando (é bash embutido), você não pode usar:quando você não tem permissões nesse arquivo. Mas você pode usar:
fonte
sudo crontab -e
para adicionar o cron job para root, não para você. Ou alterar a permissão do arquivo para 766 (ou 666), não 755:sudo chmod 766 filename
. Mais sobre: codex.wordpress.org/Changing_File_Permissionstruncate filename
é um pouco mais limpo e mais simples do que redirecionar a saída vazia para o arquivo e não se depara com problemassudo
.truncate -s 0 filename
realmente pode fazer o truque. Você pode adicioná-lo como resposta.Existe uma ferramenta criada para esse fim:
Isso limpará o conteúdo, mas continuará sendo o mesmo arquivo (o inode permanece o mesmo).
Isso é importante porque alguns programas mantêm um identificador para o arquivo "by inode". Suponha que você "esvazie" um arquivo usando o método ingênuo de excluir e recriar o arquivo. Alguns programas ainda podem manter um identificador para o arquivo antigo (com o conteúdo antigo), mesmo que ele não esteja mais visível, como os meios usuais
ls
.Alguns links para mais detalhes no final desta resposta.
Outra maneira, talvez mais fácil de lembrar:
Isso também mantém o mesmo inode.
Observe que ambos
truncate
eecho -n
não são definidos pelo POSIX .Para uso em conformidade com POSIX
cat /dev/null
:Ainda outra maneira, mais obscura e provavelmente não agnóstica:
Se o arquivo a truncar precisar de privilégios de root para gravar, as seguintes linhas não funcionarão como o esperado:
Isso ocorre porque o redirecionamento é feito pelo shell antes mesmo de o sudo ser executado. Isso significa que o acesso de gravação ao arquivo é feito usando os privilégios do usuário que executa o shell, não os privilégios que serão concedidos pelo sudo.
Uma solução alternativa é adiar o redirecionamento para um shell executado usando privilégios sudo como este:
truncate
Você não precisa usar essa solução alternativa, porque o acesso de gravação não é feito pelo shell, mas pelotruncate
qual é executado pelo sudo usando privilégios de sudo.Para obter alguns detalhes sangrentos sobre programas que mantêm o arquivo aberto, mesmo que o arquivo tenha sido excluído, você pode ler o seguinte:
fonte
Para automatizar isso, você pode usar o logrotate. Basta criar um arquivo de configuração para o arquivo que você deseja esvaziar, adicionar outras configurações e deixá-lo vazio todos os dias automaticamente com base nos critérios que você escolher todos os dias ou quando o arquivo for maior que etc.
Veja aqui como configurar o logrotate: http://linuxcommand.org/man_pages/logrotate8.html
fonte
echo "" > foo_file
é uma maneira simples de fazer isso, ele substituirá todo o conteúdo do foo_file por "" tornando-o vazio.Você também pode usar
cat /dev/null > foo_file
, que lerá o dispositivo nulo e substituirá seu arquivo sem nada.fonte