Linux - Tránh mèo: không có tệp hoặc thư mục như vậy khi tệp không tồn tại


2

Tôi đang kiểm tra thông qua một tập lệnh bash xem một tiến trình có đang chạy hay không dựa trên bộ lưu trữ PID được lưu trữ trong một tập tin. Tôi nhận được lỗi hiển thị ở trên khi tệp không tồn tại vì lệnh đang cố truy cập tệp và kiểm tra xem liệu PID có thực sự ở đó không, vì vậy nó là bình thường, nhưng tôi muốn tránh nếu có thể.

Có cách nào như vậy không?

Lệnh tôi đang sử dụng có thể được tìm thấy dưới đây.

nếu giết -0 $ (con mèo "$ pid_file")

Cảm ơn bạn trước.


hiển thị nội dung của pid_file - tôi cá là bạn có \n ở cuối tập tin đó
mnmnc

Trong mã bán người: Nếu $ PID_file tồn tại sau đó giết kill -0 $ (con mèo "$ pid_file"). Cũng thấy nếu -e . Mã UNTESTED có thể có: nếu [-e $ pid_file] sau đó lặp lại "$ pid_file. Gửi tín hiệu tiêu diệt -0 $ (cat" $ pid_file ") khác vang" $ pid_file không tồn tại. "
Hennes

cảm ơn vì đã trả lời, tệp PID chỉ lưu số tiến trình PID của ứng dụng đang chạy ... vì vậy khi ứng dụng không chạy và tệp không được tạo, tôi muốn kiểm tra xem liệu PID có tồn tại hay không để đảm bảo an toàn bên.
croussou

Thử với cat "$pid_file" | head -n 1 | tr -d "\n"
mnmnc

Bạn đã thử với pgrep? kiểm tra -F công tắc điện.
mnmnc

Câu trả lời:


2

[[ -f "$pid_file ]] && (cat "$pid_file" | head -n 1 | tr -d "\n")

Lệnh này sẽ trả về trạng thái khác không. Nếu bạn muốn "luôn luôn trả về số 0" (hy sinh mức độ dễ đọc):

[[ ! -f "$pid_file ]] || (cat "$pid_file" | head -n 1 | tr -d "\n")


Ồ tôi hiểu rồi, vì vậy về cơ bản bây giờ tôi đang làm điều ngược lại, nếu tệp tồn tại hoặc PID tồn tại dựa trên tệp ... Tôi sẽ thay đổi nó theo đề xuất của bạn và quay lại, cảm ơn.
croussou

2

Bạn cần một điều kiện để kiểm tra xem tệp có tồn tại hay không và nếu bạn không muốn thấy bất kỳ lỗi nào khi bạn cố gắng kill một PID không còn tồn tại, chuyển hướng của nó stderr đến /dev/null. Bạn sẽ kết thúc với một cái gì đó như:

PID_EXISTS=$([[ -f "$pid_file" ]] && kill -0 $(<"$pid_file") 2> /dev/null && echo 1 || echo 0)

Điều này sẽ lưu trữ 1 cho một pid hiện có, và 0 cho một cái không tồn tại Bạn có thể sử dụng biến trong một so sánh, chẳng hạn như:

if [[ $PID_EXISTS -eq 1 ]]; then echo FOUND; else echo NOTFOUND; fi

Hoặc chỉ in kết quả của nó:

echo $PID_EXISTS

Không cat. Meo!


Trong trường hợp này, tôi đề nghị thanh lọc PID không còn tồn tại khỏi danh sách với một sed... Ngay cả khi thấp, có khả năng bộ PID này trước hoặc sau sẽ được sử dụng lại ...
Hastur

1

Hoặc, bạn chỉ có thể sử dụng pgrep thay thế:

if pgrep -F "$pid_file" &>/dev/null; then
    echo yep
else
    echo nope
fi
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.