다른 프로그램에서 읽지 않고 일정 시간이 지나면 자동으로 삭제되는 임시 파일을 만들 수 있나요?

다른 프로그램에서 읽지 않고 일정 시간이 지나면 자동으로 삭제되는 임시 파일을 만들 수 있나요?

생성된 후 여러 스크립트에서 읽을 임시 파일을 생성하고 싶지만 마지막 스크립트가 이 임시 파일 읽기를 완료한 시점을 모니터링하여 매번 삭제(다른 스크립트일 수 있음)할 수 있는 쉬운 방법이 없습니다. ). 어떤 프로그램에서도 읽지 않고 특정 시간 간격이 지나면 파일을 자동으로 삭제하는 명령줄 도구를 사용하여 이 문제를 해결하는 표준 방법이 있는지 궁금합니다. 이것이 가능합니까? 아니면 이 문제를 해결하는 유일한 방법은 마지막 스크립트가 파일을 삭제하기 위해 파일 읽기를 완료한 시기를 알 수 있는 방법을 찾는 것입니까?

답변1

inotifywait를 사용하여 파일에 액세스하는 스크립트에 다음을 추가합니다.

if ! inotifywait $FILE -t $SECONDS >/dev/null 2>&1
then rm $FILE
fi &

이 스크립트는 $FILE에 액세스하기를 기다리는 프로세스를 생성합니다.
어떤 일이 발생하면 아무것도 하지 않고 종료됩니다.
$SECONDS 이후 시간 초과에 도달하면 파일이 삭제됩니다.

또는 파일이 생성될 때 실행되는 별도의 스크립트를 사용하세요.

while inotifywait $FILE -t $SECONDS >/dev/null 2>&1
do sleep 1
done
rm $FILE

파일에 액세스할 때마다 반복되며,
시간 초과 내에 아무 것도 액세스하지 않으면 파일을 중단하고 삭제합니다.

답변2

기반으로타이유대답은 이 문제를 해결하기 위해 inotifywait제가 만든 솔루션을 사용합니다 node.js. 제가 물었을 때 예상했던 것보다 더 자세한 내용이 필요합니다. Node.js 코드를 게시하기에 적합한 장소가 아니라면 죄송합니다. 하지만 언어의 비동기적 특성으로 인해 작업이 더 쉬워졌습니다... 내 솔루션은 다음과 같습니다.

const fs = require('fs');
const spawn = require("child_process").spawn;

const file='/home/user/hugefile.csv';
let counter = 0; // counter used for identifying how many times the file was opened and closed by a different program

const child = spawn('/bin/bash', [ '-c', `inotifywait --format=%e -q -m -e access,close ${file}` ])

child.stdout.on('data', (data) => {
    let line = data.toString().split('\n').filter(item => item); // get events inside a javascript array and filter empty values
    // loop through the inotify events
    line.forEach(function(event) {
        if ( event === "ACCESS" )
            counter++;
        else if ( event === "CLOSE_NOWRITE,CLOSE" )
            counter--;

        // asynchronous function that checks the value of counter after 10 seconds
        async function timer() {
            await sleep(10000);
            console.log(counter);
            if ( counter === 0 ){
                fs.unlinkSync(file); // erase file
                console.log("tmpfile erased!")
                process.exit();
            }
        }
        timer();
    });
});

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

기본적으로 저는 이것을 inotifywait문제 해결을 위한 기초로 사용하고 있습니다... 임시 파일을 생성한 후 이 스크립트를 실행하면 되고 다른 모든 프로그램이 해당 파일 읽기를 마친 후(10초 후) 파일이 삭제됩니다.


OBS: 제가 해결하려고 하는 문제는 bash함수가 프로세스로 실행될 때 &함수 내 전역 변수의 새 값에 대한 제어를 상실한다는 것입니다. 그래서 counter제가 사용한 것과 동일한 논리를 사용하여 상태를 얻을 수 없습니다 node.js. 해결 방법을 아는 사람이 있으면 여기에 의견을 자유롭게 작성해 주세요. :)

관련 정보