RAM에 임시 파일을 만드는 방법은 무엇입니까? 루프의 각주기 후에 tac scriptnameYYYYMMDD.txt

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

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



답변

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


답변

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

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


답변

다음 대답은 이전의 답변이 질문의 정보를 조사하여 발견 된 이곳을 하고하지 않고 발견되지 않았을 것입니다. 그들에게 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각각.


답변

내가 알고있는 것처럼, 목표는 다음과 같다 : (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 ) 


답변