임시 파일을 생성한 후 직접 액세스하려면 어떻게 해야 합니까?

임시 파일을 생성한 후 직접 액세스하려면 어떻게 해야 합니까?

SSH를 통해 원격 호스트에 연결하고 임시 파일을 생성하고 다음 명령을 실행하는 스크립트가 있습니다.

시스템 호출(mysql --database=information_schema --host=localhost < /tmp/drush_1JAjtt)

매번 다른 파일을 생성합니다(모드: ) drush_xxxxxx.

리모컨에서 수동으로 몇 번 실행해 보았습니다.

tail -f /tmp/drush_*

하지만 연결이 너무 느리고 대부분의 경우 오류가 발생합니다.

꼬리: `/tmp/drush_*'를 읽기 위해 열 수 없습니다: 해당 파일이나 디렉토리가 없습니다

해당 파일을 생성한 후 즉시 액세스하여 내용을 표시할 수 있는 방법이 있습니까?

답변1

이 문제가 발생했을 때특정 애플리케이션의 동작 확인나는 그것을 신뢰하지 않습니다. 응용 프로그램은 임시 파일을 생성한 다음 삭제합니다. 노브의 솔루션괜찮지만 이를 사용하면 cat경쟁 조건이 발생할 수 있습니다(즉, 작업 중에 파일이 cat삭제될 수 있으므로 데이터의 일부만 검색됩니다).

파일 자체에 대한 하드 링크를 생성하면 경쟁 조건이 발생할 가능성을 줄일 수 있습니다. grep하드 링크 생성 및 생성은 를 통해 결합될 수 있습니다 awk. 그래서 저는 다음을 생각해냈습니다.

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]);}'

플래그를 사용하고 있으므로 -e create즉시 생성될 임시 파일에만 관심이 있으며 출력 형식은 생성될 임시 파일의 전체 경로를 제공합니다. 전달된 출력의 처음 두 줄을 무시합니다 NR>2. 보고된 각 파일에 대해 하드 링크가 다음 형식으로 생성됩니다./tmp/hardlink_to_<original filename>

답변2

inotify( inotify-toolson ) 을 사용하는 스크립트를 설정 Debian하고 특정 디렉터리의 파일에서 변경 사항을 검색하도록 할 수 있습니다. 그런 다음 파일 이름을 필터링하여 cat로그 파일에 저장합니다.

답변3

drush는 다음 두 가지 방법 중 하나로 이 임시 파일을 사용할 수 있습니다.

  1. 파일을 생성한 후 사용자에게 남겨두는 것입니다.
  2. 파일을 생성한 다음 이를 정리합니다.

내 생각에는 (1)의 경우에는 사실 이후에 파일을 수동으로 검사할 수 있으므로 문제가 없을 것입니다. 그러면 문제는 짧은 수명 동안 임시 파일을 확인하고 싶다는 것입니다.

외부 프로세스를 사용하여 임시 파일을 모니터링하는 것은 매우 효과적일 수 있습니다. 물론 이는 임시 파일의 지속 시간(5ms? 500ms? 5초? 5분?)과 모니터링 시스템의 응답 속도에 따라 다릅니다.

또 다른 방법은 "mysql" 명령을 사용하여 관심 있는 데이터를 기록하는 것입니다. 예를 들어, "mysql"이 "/usr/bin/mysql"에 있으면 "/usr/local/"bin/mysql" 파일을 만들 수 있습니다.

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

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

답변4

파일이 짧은 시간 내에 생성된 경우 스크립트를 실행하기 전에 별도의 터미널에서 다음 명령을 실행할 수 있습니다.

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

/tmp/drush_*당신의 패턴은 어디에 있습니까? 장점은 속도가 빠르고 외부 도구를 설치할 필요가 없다는 것입니다(관리자/루트 권한이 없는 경우).

이 특별한 경우에는 시계를 배치한 후에 파일이 생성되고 변경 사항이 감지되지 않기 때문에 inotifywatch(from ) 도구를 사용하면 작동하지 않습니다. inotify-tools더 읽어보세요:inotify가 변경된 파일 목록을 인쇄하지 않는 이유는 무엇입니까?

inotifywait그러나 Linux의 inotify 인터페이스를 사용하여 파일 변경을 효과적으로 기다리는 도구를 계속 사용할 수 있습니다 .

간단한 예는 다음과 같습니다.

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

그리고 예제에서는 새로 생성된 파일의 내용을 보여줍니다 /tmp.

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

필요한 경우 sudo앞에 추가하세요. 당신에게 맞게 cat변화 /tmp하고 가치를 부여하세요.drush

관련 정보