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

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

출력 을 생성하는 for 루프의 각 루프 후에는 로그 출력이 맨 위에 있는 최신 줄과 함께 브라우저 창에 표시 |tee scriptnameYYMMDD.txt되도록 파일 내용을 반전시킵니다 .tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt

이 작업을 병렬로 수행하는 여러 스크립트가 있습니다. 디스크 활동을 최소화하려고 하므로 |tee scriptnameYYYYMMDD.txtRAMdisk로 출력하는 것이 가장 좋습니다. mktemp폴더에 파일이 생성되었지만 /tmp해당 파일이 디스크 외부에 있는 것으로 보이지 않습니다.

답변1

tmpfs파티션을 마운트하고 그 안에 파일을 쓸 수 있습니다 :

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

이제 파티션이 500MB로 제한됩니다. 임시 파일이 500MB를 초과하면 다음 오류가 발생합니다 no space left on device. 그러나 지정한 공간의 양이 시스템 RAM의 양보다 큰 경우에는 문제가 되지 않습니다. tmpfs스왑 공간도 사용되므로 .NET과 달리 시스템을 강제로 충돌시킬 수 없습니다 ramfs.

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

command | tee /mountpoint/scriptnameYYYYMMDD.txt

답변2

이전 답변과 이 질문의 정보를 조사하여 다음 답변을 찾았습니다.여기그들 없이는 발견되지 않을 것입니다. 감사합니다.

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

검사를 위해 df -T.

11:41:11 제시@림보:~$ 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% /실행 중/잠김
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 -u보면 사용자 ID를 얻을 수 있습니다 .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그런 다음 RAM에 임시 파일을 생성하는 옵션이 포함된 명령을 사용하여 --tmpdir이 임시 파일 시스템에 임시 파일과 디렉터리를 생성 할 수 있습니다 .

주어진 조언을 따르십시오여기먼저 임시 디렉터리를 만든 다음 그 안에 임시 파일을 만듭니다.

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.shscript 에 의해 실행될 때 반환됩니다 $(basename $0). myScript.sh따라서 위 명령은 /run/user/1000/myScript.sh.w42BYxbG/및 각각을 생성합니다 /run/user/1000/myScript.sh.w42BYxbG/myScript.sh.BCzSmq06.

답변3

Ubuntu를 사용하여 다음을 시도해 보세요.

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

답변4

제가 이해한 바에 따르면 목표는 다음과 같습니다: (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 ) 

관련 정보