스크립트에서 다른 프로세스가 파일을 현재 쓰고 있는지 어떻게 확인할 수 있습니까?


21

스크립팅을 처음 접했으므로 잘못된 트리를 짖을 수도 있지만 현재 상황은 다음과 같습니다.

스크립트에서 soffice를 시작합니다 . odtpdf 로 변환하는 방법

그 보인다 soffice를이 스크립트의 과정에서 자신을 분리하고, 자신의 일을 방황 .. 좋아, 좋은 것을; GUI 앱은 그렇게하는 경향이 있습니다 ...

그러나 다음 단계는 새 pdf 처리와 관련 되므로 새 pdf 가 완전히 작성 될 때까지 기다려야합니다 .

(내가 아는 한) soffice의 process-ID는 스크립트가 시작되기 전에 이미 실행중인 프로세스 일 수 있기 때문에 사용할 수 없습니다. soffice 는 다른 관련없는 문서 / 프레젠테이션 / 스프레드 시트에 대한 정상적인 GUI 활동을 위해 이미 열려있을 수 있습니다.

나를위한 문제의 핵심은 계속 진행하기 전에 새 PDF 작성 이 완료되어야한다는 것입니다 ...

"쓰기"모드에서 파일이 더 이상 다른 프로세스에 열려 있지 않은지 확인할 방법이 있습니까? ...

답변:


25

lsof | grep /absolute/path/to/file.txt파일이 열려 있는지 확인할 수 있습니다 . 파일이 열려 있으면이 명령은 상태 0을 반환하고, 그렇지 않으면 256 (1)을 반환합니다.

일반적으로 언제든지 많은 파일이 열리므로이 명령은 1 초가 걸립니다.

lsof -c gedit예를 들어을 사용하여 어떤 파일 gedit이 열렸는지 확인할 수도 있습니다 . 출력을 하나의 프로세스로 제한하면 실행 시간이 실질적으로 단축됩니다.

기다리는 스크립트는 다음과 같습니다.

#!/bin/bash

while :
do
    if ! [[ `lsof -c python3.2 | grep test.py` ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"

프로세스 'pyhton3.2'에 'test.py'파일이 열려있는 동안 실행됩니다. 파일이 닫히 자마자 'echo done'으로 이동하고 종료합니다.

나는 루프가 CPU를 심하게 낭비하지 않도록 'sleep 0.5'를 넣었습니다. 그렇지 않으면 100 % CPU를 사용합니다.

보너스 ODT를 pdf로 쉽게 정리할 수있는 방법이 있습니다 :

이 멋진 팁에 대한 오픈 오피스 포럼의 scls19fr에게 감사합니다. unoconv -f pdf input.odtunoconv를 얻으려면 터미널에서 간단히 실행 하여 명령 줄에서 OpenOffice Writer 파일을 PDF로 변환 할 수 있습니다 sudo apt-get install unoconv. (rhyshale.wordpress.com의 rhyshale)


이것을 루프로 감싸면 거래가 있습니다.
Nick Pascucci

했어요 :-) 끔찍한 스타일이 아니길 바랍니다. 모범 사례를 읽지 않아도됩니다. 어쨌든 잘 작동합니다.
Stefano Palazzo

감사 스테파노는 ... 예, 그것은 좋은 및 정답 그래서 .. 하나의 보조 노트, 무엇을 다음 soffice에서 일어나는 것은이라고 강조했다 ... 작업을 수행 하지 것 같다 .. 생각만큼 임시 파일이 작성 중이며 최종 파일의 이름이 (아마 / 아마도) 이름이 바뀌면 이름이 바뀝니다. 그래서 지금보고 있습니다 ...이 경우 * 존재 를 기다려야 할 수도 있습니다 ... ... 그리고 unoconv에 대한 링크에 감사드립니다 .. 내가 살펴볼 것입니다 .. (전체적으로, .pdf를 페이지 당 하나씩 .jpegs로 변환하고 있습니다)
Peter.O November

@ fred.bear는 파일이 존재할 때까지 기다리려면 if 문을 다음과 같이 바꾸십시오 if [ -f test.odf ]. (bash 스크립트는 때때로 매우 비밀 스러울 수 있습니다 ...)
Stefano Palazzo

6
시도 lsof -- /path/to/file피하기 위해 대신 grep'보내고
RubyTuesdayDONO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.