Làm thế nào, trong một tập lệnh, tôi có thể xác định xem một tập tin hiện đang được ghi bởi một quy trình khác không?


21

Tôi rất mới với bash scripting, vì vậy tôi có thể đang sủa sai cây, nhưng đây là tình huống hiện tại của tôi:

Trong một kịch bản, tôi bắt đầu soffice ; để chuyển đổi một odt thành pdf

Có vẻ như soffice tự tách ra khỏi quy trình của kịch bản và đi lang thang để làm việc riêng của mình .. Được rồi, điều đó tốt; Các ứng dụng GUI có xu hướng làm điều đó ...

Tuy nhiên tôi cần đợi cho đến khi bản pdf mới được viết hoàn chỉnh, vì bước tiếp theo của tôi là xử lý bản pdf mới đó .

(Theo như tôi biết) Tôi không thể sử dụng ID tiến trình của soffice, bởi vì nó có thể đã là một quy trình đang chạy trước khi tập lệnh của tôi bắt đầu: vd. soffice có thể đã được mở cho hoạt động GUI bình thường cho một tài liệu / bản trình bày / bảng tính không liên quan khác.

Mấu chốt của vấn đề đối với tôi là trước khi tôi có thể tiến hành, việc viết pdf mới phải được hoàn thiện ...

Có cách nào để xác định khi một tệp không còn mở cho một quá trình khác trong chế độ "ghi" không? ...

Câu trả lời:


25

Bạn có thể sử dụng lsof | grep /absolute/path/to/file.txtđể xem nếu một tập tin được mở. Nếu tệp được mở, lệnh này sẽ trả về trạng thái 0, nếu không nó sẽ trả về 256 (1).

Xin lưu ý rằng lệnh này sẽ mất một giây vì thông thường, có rất nhiều tệp được mở bất cứ lúc nào.

Bạn cũng có thể sử dụng lsof -c gedit, ví dụ, để xem tập tin gedit nào đã mở. Việc giới hạn đầu ra trong một quy trình sẽ giảm thời gian thực hiện xuống thực tế.

Đây là một kịch bản để chờ:

#!/bin/bash

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

Quá trình này chạy trong khi một quá trình 'pyhton3.2' đã mở tệp 'test.py'. Ngay sau khi tệp được đóng, nó sẽ chuyển sang 'echo xong' và thoát.

Tôi đã đặt 'ngủ 0,5' vào đó để vòng lặp không làm hỏng CPU quá nhiều. Nếu không, nó sẽ sử dụng 100% cpu.

Tiền thưởng Dường như có một cách dễ dàng để chuyển odt sang pdf:

Cảm ơn scls19fr trên Diễn đàn OOo về mẹo đáng yêu này. Bạn có thể chuyển đổi các tập tin OpenOffice Writer thành PDF từ dòng lệnh bằng cách sử dụng unoconv -f pdf input.odtđể có được unoconv, chỉ cần chạy sudo apt-get install unoconvở thiết bị đầu cuối. (nhịp điệu của rhyshale.wordpress.com)


Gói cái này trong một vòng lặp cho đến khi bạn có một thỏa thuận.
Nick Pascucci

Làm xong mà. :-) Tôi hy vọng nó không phải là phong cách khủng khiếp - không bận tâm để đọc các thực tiễn tốt nhất. Dù sao nó cũng hoạt động tốt.
Stefano Palazzo

Cảm ơn Stefano ... vâng, nó hoạt động ... vì vậy đó là một câu trả lời đúng và chính xác .. Một lưu ý phụ, nó đã nhấn mạnh rằng những gì đang xảy ra trong soffice không như tôi nghĩ .. Có vẻ như đó là một tập tin tạm thời đang được tạo và tập tin cuối cùng (có lẽ / có thể) được đổi tên sau khi hoàn thành ... Vì vậy, bây giờ tôi đang xem xét điều đó ... trong trường hợp đó, tôi có thể chỉ cần chờ đợi sự tồn tại * của nó ... ... và cảm ơn vì liên kết trên unoconv .. Tôi sẽ xem xét nó .. (nói chung, tôi đang chuyển đổi .pdf thành nhiều ..jpeg một trang mỗi trang)
Peter.O

@ fred.bear để đợi cho đến khi một tệp tồn tại, thay thế câu lệnh if bằng câu lệnh này : if [ -f test.odf ]. (kịch bản bash đôi khi rất khó hiểu ...)
Stefano Palazzo

6
lsof -- /path/to/filethay vào đó, hãy cố gắng tránh grep'ing
RubyTuesdayDONO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.