RAM에 임시 파일을 만드는 방법은 무엇입니까?


29

출력을에 파이프하는 스크립트가 |tee scriptnameYYMMDD.txt있습니다. 출력이 생성되는 for 루프의 각주기 후에 tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt, 로그 내용 이 가장 최신 행이있는 브라우저 창에 표시되도록 파일 내용을 반대로 바꿉니다 .

이 작업을 동시에 수행하는 여러 스크립트가 있습니다. 디스크 활동을 최소화하려고 노력하고 있으므로 |tee scriptnameYYYYMMDD.txtRAMdisk 로의 출력 이 가장 좋습니다. 폴더에 mktemp파일을 /tmp만들지 만 디스크 외부에없는 것처럼 보입니다.


ramfs 또는 tmpfs 여야합니다 (두 번째가 좋습니다). 그러한 fs가 이미 시스템에 마운트되어 있는지 확인하십시오. 그렇다면 사용하십시오. 그렇지 않은 경우 마운트해야합니다.
peterh는

나는 업데이트 할 것 fstab를 장착하기 위해 tmpfs/tmp다음 컴퓨터를 다시 부팅합니다.
kasperd

1
전체 작업을 수행하는 대신 tail파일을 점진적으로 사용 (또는 요청시 CGI를 통해 시작) 하는 것을 고려할 수 있습니다 tac.
mikeserv

이것은 테스트에서 작동하는 것 같습니다 (감소 된 형식에 대해 죄송합니다) TEMPPATH="/ramdisk" LOGPATH="/var/www/html/log" ... echo <various calls to echo> | tee -a $TEMPPATH/moveKRT$(date '+%Y%m%d').txt ... for 루프가 끝나면 cp $TEMPPATH/moveKRT$(date '+%Y%m%d').txt $LOGPATH/moveKRT$(date '+%Y%m%d').txt tac $TEMPPATH/moveKRT$(date '+%Y%m%d').txt > $LOGPATH/moveKRT.txt 23 : 59 : 59.999에서 00:00으로 변경 될 수있는 작은 가능성을 알고 있습니다. 00은 일부 파일에 영향을 줄 수 있지만 기회는 허용됩니다.
user208145

이것에 대한 진행 상황 업데이트 : / ramdisk에 1GB tmpfs 볼륨이 마운트되어 있습니다. FTP를 통해 사용자 홈 폴더로 파일이 들어옵니다. 처리하기 위해 하위 폴더 / ramdisk / queues / xyz /로 이동 한 후 삭제됩니다. 시작할 때 / ramdisk 아래에 필요한 디렉토리 구조를 다시 작성하는 스크립트가 있습니다. 이로 인해 들어오는 파일에 대한 디스크 활동이 최소화됩니다. 지금까지 이러한 스크립트의 디스크 I / O를 줄이는 다른 방법은 FTP를 통해 사용자 폴더로 파일을 보내기 전에 시작시 작성된 tmpfs에 해당 사용자 폴더를 작성하는 것입니다. 모두 감사합니다.
user208145

답변:


22

tmpfspartititon을 마운트 하고 파일을 작성할 수 있습니다 :

mount -t tmpfs -o size=500m tmpfs /mountpoint

이 파티션은 이제 500MB로 제한됩니다. 임시 파일이 500MB보다 커지면 오류가 발생 no space left on device합니다.. 그러나 시스템 RAM보다 많은 공간을 지정할 때는 중요하지 않습니다. tmpfs스왑 공간도 사용하므로 반대로 시스템 충돌을 일으킬 수 없습니다 ramfs.

이제 파일을 /mountpoint다음에 쓸 수 있습니다 .

command | tee /mountpoint/scriptnameYYYYMMDD.txt

3
size=[num]%tmpfs는 사용 가능한 메모리의 백분율로 제한 될 수 있습니다. 명령이 항상 동일한 (실제 / 가상) 머신을 대상으로하지 않는 경우 일반적으로 그렇게하는 것이 더 쉽습니다 . 또한 tmpfs가 내용을 삭제하지 않는 것이 편리합니다 -o remount,size=newsize.
mikeserv

1
우리는 루트에 의해 실행된다고 가정 할 이유가없는 bash는 스크립트 주위의 질문의 공전 때문에, 당신은 하나의 주위에 얻을 수있는 여부를 지정할 수 있습니다 mount루트가 아닌 사용자가 사용할 수있게되지 -t-o? 즉, tmpfs적절한 파일 시스템이 시스템에 존재하지 않는 경우 디스크 작업을 절약하기 위해 (또는 다른 방식으로 RAM 을 사용하는) 스크립트를 어떻게 작성할 수 있습니까?
Jonathan Y.

좋은 대답이 아닙니다. 루트가 아닌 경우 실패합니다.
Alex

11

우분투로 이것을 시도하십시오 :

ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"

3
쓰기가 얼마나 안정적인 /run/shm/가요? chmod필요한 경우 임시 파일에 변경 사항을 적용 할 수 있습니까 ? 폴더의 모드 비트가 /tmp폴더와 동일하다는 것을 알았습니다 . 감사.
user208145

1
다른 디렉토리의 경우 /run/shm(symlink to /dev/shm) 에서 생성 된 파일 mktemp의 기본 권한은 -rw-------(600)이며 필요한 경우로 변경할 수 있습니다 sudo chmod.
KrisWebDev

9

다음 대답은 이전의 답변이 질문의 정보를 조사하여 발견 된 이곳을 하고하지 않고 발견되지 않았을 것입니다. 그들에게 Cudos.

내 linuxmint 시스템에는 (그리고 대부분의 우분투 기반 시스템과 아마도 데비안 기반이라고 가정 할 것입니다) 사용자 소유의 tmpfs가 자동으로 마운트되어 있습니다 /run/user/1000/

df -T확인하는 데 사용 합니다.

11:41:11 jesse @ Limbo : ~ $ df -T
사용 된 파일 시스템 유형 1K 블록 사용 가능한 비율
udev devtmpfs 15904812 4 15904808 1 % / dev
tmpfs tmpfs 3184120 1700 3182420 1 % / 실행
/ dev / sdb2 ext4 14248880 11464788 2037240 85 % /
없음 tmpfs 4 0 4 0 % / sys / fs / cgroup
없음 tmpfs 5120 0 5120 0 % / run / lock
없음 tmpfs 15920584 848 15919736 1 % / run / shm
없음 tmpfs 102400 12 102388 1 % / run / user
/ dev / sdb3 ext4 100861352 90755700 4959136 95 % / mnt / data

에서 /run/user/시스템의 각 일반 사용자를위한 디렉토리가

12:07:35 jesse@Limbo:~$ ls -l /run/user
total 0
drwx------ 2 root  root   40 Aug  7 09:50 0
drwx------ 8 jesse jesse 180 Aug  7 11:38 1000

이 디렉토리는 해당 사용자의 ID로 이름이 지정됩니다. 이 명령에 대한 자세한 내용 은 사용자 ID를 id -u참조하십시오 man id.

12:07:43 jesse@Limbo:~$ ls -l /run/user/$(id -u)
total 0
drwx------ 2 jesse jesse  60 Aug  7 09:50 dconf
dr-x------ 2 jesse jesse   0 Aug  7 09:50 gvfs
drwx------ 2 jesse jesse  80 Aug  7 09:50 pulse
lrwxrwxrwx 1 root  root   17 Aug  7 09:50 X11-display -> /tmp/.X11-unix/X0

그런 다음이 mktemp명령을 --tmpdir옵션 과 함께 사용 하여이 임시 파일 시스템에 임시 파일 및 디렉토리를 작성하여 RAM에 임시 파일을 작성할 수 있습니다.

여기에 제공된 조언에 따라 먼저 임시 디렉토리를 작성한 다음 임시 파일을 작성하십시오.

mydir=$(mktemp -dt "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u))

임시 디렉토리를 /run/user/1000/bash.w42BYxbG/만든 다음

myfile=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=$mydir)

임시 파일을 만들려면

이렇게하면이 파일을 쉽게 정리할 수 rm -r $mydir있습니다.

기본적으로 이러한 모든 파일은 파일을 만든 사용자 만 소유하고 읽을 수 있습니다.

참고 : $(basename $0)명령 부분은 mktemp를 실행 한 스크립트 / 프로세스의 이름을 추출합니다. 내가 스크립트가있는 경우 /home/jesse/scripts/myScript.sh다음 $(basename $0)반환 myScript.sh이 스크립트에 의해 실행될 때. 따라서 위의 명령을 만들 것입니다 /run/user/1000/myScript.sh.w42BYxbG//run/user/1000/myScript.sh.w42BYxbG/myScript.sh.BCzSmq06각각.


/run/user/1000systemd를 사용하는 각 리눅스에서 사용할 수 있으므로 데비안 기반 시스템뿐만 아니라 대부분의 다른 리눅스 배포판에서도 사용할 수 있습니다. 그렇지 않으면 / tmp를 대신 사용해야합니다. 변수 $ XDG_RUNTIME_DIR을 사용하여 각 사용자에 대해 올바른 디렉토리를 이미 유지함으로써 명령을 단순화 할 수 있습니다. 자세한 내용은 다음 예를 확인하십시오. unix.stackexchange.com/questions/162900/…
Alex

1
mktemp를 통해 mkstemp를 사용하십시오! 이유 : linux.die.net/man/3/mktemp : 버그 섹션에서 "... mktemp ()를 사용할 때마다 보안 위험이 있습니다. 경쟁은 mkstemp (3)에 의해 피할 수 있습니다."
Alex

0

내가 알고있는 것처럼, 목표는 다음과 같다 : (1) 않는 브라우저에 제공 할 디스크에 반전 된 파일을 저장 (참고 :이 모든으로, 등, 다른 답변 이미 세부의 tmpfs 될 수있다); 그러나, (2) 최초의 tmp 파일을 원래 출력으로 디스크에 기록하지 마십시오. 그럼에도 불구하고 (3) 여전히 원래 출력을 표준 출력으로 표시합니다.

그렇다면 bash 프로세스 대체 (즉, 기본적으로 명명 된 파이프)를 사용하여 다음이 귀하의 요구를 충족시킬 수 있습니다 .

command | tee >( tac > /var/www/html/logs/scriptname.txt )

이것은 출력을 stdout으로 계속 인쇄하고 있으며 명령이 종료되면 (루프가 종료 될 때) 해당 출력을 되돌리고 출력 파일에 씁니다. 초당 한 줄씩 인쇄하는 다음을 통해 설명되며, 종료 후 파일 /tmp/foo.txt에 반전 된 줄이 포함됩니다.

i=0
while [ $i -lt 10 ]; do
    ((i = i+1))
    echo "==$i== $(date)"
    sleep 1
done | tee >( tac >> /tmp/foo.txt ) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.