Como acessar o arquivo temporário logo após a criação?

2

Eu tenho um script que está se conectando ao host remoto via SSH, cria um arquivo temporário e executa o seguinte comando:

Calling system(mysql --database=information_schema --host=localhost < /tmp/drush_1JAjtt)

Cada vez que cria um arquivo diferente (padrão: drush_xxxxxx ).

Eu tentei algumas vezes rodar manualmente no controle remoto:

tail -f /tmp/drush_*

mas minha conexão é muito lenta e na maioria das vezes acabei com o erro:

tail: cannot open '/tmp/drush_*' for reading: No such file or directory

Existe algum truque para acessar tal arquivo logo após sua criação para mostrar seu conteúdo?

    
por kenorb 28.10.2014 / 23:53

4 respostas

2

Se o arquivo for criado por um curto período de tempo, você pode executar o seguinte comando no terminal separado antes de executar o script:

while true; do cat /tmp/drush_* 2>/dev/null && break; done

Onde /tmp/drush_* é seu padrão. A vantagem é que é rápido e não é necessário instalar nenhuma ferramenta externa (se você não tiver, por exemplo, permissões de administrador / root).

Por favor, note que usar a ferramenta inotifywatch (de inotify-tools ) não funcionará neste caso em particular, porque o arquivo é criado depois que os relógios foram colocados e a mudança não será detectada. Leia mais: Por que inotify não imprime a lista de arquivos alterados?

Mas você ainda pode usar a ferramenta inotifywait , que aguarda eficientemente as alterações nos arquivos usando a interface inotify do Linux.

Aqui está o exemplo simples:

inotifywait -m --format "%e %f" /tmp

E exemplo para mostrar o conteúdo de arquivos recém-criados em /tmp :

inotifywait -m --format "%f" /tmp | grep --line-buffered ^drush | xargs -L1 -I% cat /tmp/% 2> /dev/null

Adicione sudo antes de cat , se necessário. Altere /tmp e drush para seus valores adequados.

    
por 29.10.2014 / 14:06
3

Eu encontrei esse problema ao examinar o comportamento de um aplicativo específico em que não confiava. O aplicativo criaria e depois excluiria seus arquivos temporários. a solução da kenorb é boa, no entanto, usar cat pode levar a uma condição de corrida (ou seja, um arquivo pode ser removido enquanto cat está funcionando, então apenas dados parciais são recuperados).

Uma menor chance de condição de corrida pode ser feita com a criação de um link físico para o arquivo em si. grep ing e criação de hard link podem ser combinados via awk . Assim, o que eu descobri é o seguinte:

inotifywait -e create -m --format "%w/%f" /tmp/suspicious_dir/ 2>&1 | 
awk 'NR>2{n=split($0,a,"/");system("ln "$0" /tmp/hardlink_to_"a[n]);}'

Como estamos usando -e create flag, estamos interessados somente em arquivos temporários que serão criados imediatamente e o formato de saída nos fornece o caminho completo para o arquivo temporário criado. Ignorando as duas primeiras linhas de saída via NR>2 . Para cada arquivo relatado, será criado um link físico no formulário /tmp/hardlink_to_<original filename>

    
por 11.09.2018 / 00:23
2

Você pode configurar um script que use inotify ( inotify-tools on Debian ) e fazer com que ele verifique todas as alterações de arquivos em um diretório específico. Em seguida, filtre o nome do arquivo e cat em um arquivo de log.

    
por 28.10.2014 / 23:58
2

drush provavelmente está usando esse arquivo temporário de duas maneiras:

  1. Está criando o arquivo; usando isso; e depois deixar por aí.
  2. Está criando o arquivo; usando isso; e depois limpá-lo.

Meu palpite é que você não estaria fazendo a pergunta no caso (1), porque você poderia apenas inspecionar o arquivo manualmente após o fato. Então, o problema é que você quer inspecionar esse arquivo temporário durante sua vida útil momentânea.

Usar um processo externo para monitorar arquivos temporários pode ter uma boa probabilidade de funcionar - embora dependa de quanto tempo os arquivos temporários duram (5ms? 500ms? 5s? 5min?) e quão rápido seu sistema de monitoramento responde. / p>

Outra abordagem é instrumentar o comando "mysql" para registrar os dados nos quais você está interessado. Por exemplo, se "mysql" estiver em "/ usr / bin / mysql", você poderá criar um arquivo "/ usr / local / bin / mysql "com:

#!/bin/bash
LOG=/tmp/mysql-commands
REALCMD=/usr/bin/mysql

NOW=$(date)
echo "[[$NOW: Running: $REALCMD $@]]" >> "$LOG"
tee -a "$LOG" | "$REALCMD" "$@"
exit $?
    
por 29.10.2014 / 01:53