PID của một bash con bash (imapsync) - làm thế nào để bạn có được nó?


15

Có ai có thể cho tôi biết làm thế nào để có được lệnh PID được thực thi trong bash không.

Ví dụ: tôi có một tập lệnh bash chạy imapsync.

Khi tập lệnh bị giết, quá trình imapsync không phải lúc nào cũng bị giết, vì vậy tôi muốn có thể xác định PID của imapsync theo chương trình từ tập lệnh của mình, để tôi có thể tự mình xử lý imapsync trong trình xử lý tín hiệu.

Vì vậy, làm thế nào để tôi lập trình nhận được PID của một tiến trình con từ tập lệnh bash cha?


1
Làm thế nào về "pidof imapsync"? Có gì sai với nó?
pitr

2
Tôi không biết về pidof. Tuy nhiên, bây giờ tôi đã làm, nó không hữu ích cho kịch bản này theo như tôi có thể nói, bởi vì pidof dường như trả lại tất cả các lệnh của lệnh đã cho trên một hệ thống - ngay cả những kịch bản thuộc sở hữu của các tập lệnh / người dùng khác. Ngoài ra, imapsync thực sự là một tập lệnh perl, vì vậy tôi sẽ thực hiện một pidof perl, một lần nữa có khả năng trả về các quy trình không phải là imapsync và có thể thuộc về người dùng khác.
Jason Tan

Javier đúng. Trang này sẽ cung cấp thêm thông tin về ProcessManagement .
phạm tội

Câu trả lời:


4

imapsync có một tùy chọn để đặt nơi viết pid của nó:

--pidfile: tập tin nơi imapsync pid được viết.


FYI điều này không thực sự trả lời câu hỏi của tôi theo nghĩa chung, nhưng tôi đã khám phá ra --pidfile arg và với một số câu hỏi xung quanh nó đã đủ tốt cho đến nay ..
Jason Tan

@JasonTan tại sao lại dạy một người đàn ông câu cá, khi bạn có thể cho anh ta một miếng phi lê nấu sẵn ngon lành, để anh ta quay lại và cằn nhằn bạn để biết thêm, ngày mai, eh? xin lỗi vì bài viết cũ, nhưng tại sao lại chấp nhận câu trả lời này trên Javiers?
không đồng bộ

46
any_command args &
my_child_PID=$!

IOW, giống như $$giữ PID của bạn, $!có PID của lệnh nền được thực hiện gần đây nhất .


Cảm ơn, nhưng imapsync không được nền và $! không được đặt nếu tôi lặp lại nó trên dòng tiếp theo sau khi gọi imapsync hoặc dòng đầu tiên của trình xử lý tín hiệu. :-(
Jason Tan

6
nếu nó giả mạo và làm nền cho đứa trẻ, thì trách nhiệm của cha mẹ là phải lưu lại đứa trẻ ở đâu đó. thực hành thông thường là tiết kiệm nó ở đâu đó như thế nào /var/run/whatever.pid. Có thể có một tùy chọn dòng lệnh để yêu cầu nó lưu PID ở đâu đó; nếu không, đó có vẻ là một tính năng để hỏi tác giả hoặc tự thực hiện.
Javier

1
Nhấn mạnh vào nền . Nếu không có quá trình nào được đặt vào nền (nghĩa là có thêm &), thì $!biến không được xác định.
Trevor

1
Nhiều giải pháp tương tự được đề xuất trong (một câu trả lời cho) Làm thế nào để có được pid của quá trình vừa mới bắt đầu ; như là một bổ sung cho câu trả lời này, một bình luận ở đó nói: oh, và "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24/11 'lúc 14:28
imz - Ivan Zakharyaschev

10

Không giống như pidof, pgrepcó thể được cung cấp nhiều tùy chọn để hạn chế các quá trình mà nó trả về các PID cho. Một cách có thể đặc biệt hữu ích là chọn dựa trên PPID bằng cách sử dụng PID của quy trình hiện tại.

pgrep -P $$ imapsync

sẽ chỉ xuất ra các mã imapsync nếu chúng là tập lệnh con của bạn.


0

Làm thế nào về việc đặt imapsync trong nền trong giây lát, nhận được PID và sau đó chuyển tiếp nó ... Một cái gì đó như thế này:

imapsync &
pid=$!
wait $pid
retVal=$?
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.