Làm cách nào để xác định tên quy trình của ứng dụng?


13

Đây là tình huống:

Làm việc trên (phiên bản tiếp theo) của trình soạn thảo Danh sách nhanh Unity, tôi muốn thêm một cách đáng tin cậy để "khởi động lại" các biểu tượng trình khởi chạy. Để làm như vậy, tôi cần xóa biểu tượng (chỉnh sửa gs settings) và thay thế nó trên cùng một vị trí. Cho đến nay không có vấn đề. Tuy nhiên, nếu ứng dụng đang được đề cập đang chạy, người dùng có thể sẽ mất dữ liệu, vì ứng dụng sẽ thoát khi biểu tượng của nó bị xóa khỏi trình khởi chạy. Điều tôi cần là một cách đáng tin cậy để tìm tên quy trình của ứng dụng, để trình soạn thảo kiểm tra danh sách các quy trình đang chạy nếu ứng dụng đang chạy và gửi thông báo cảnh báo cho người dùng rằng không thể khởi động lại biểu tượng nếu ứng dụng là đang chạy.

Những gì tôi đã làm cho đến nay là làm cho trình soạn thảo nhìn vào tệp máy tính để bàn, để đọc lệnh, cũng đọc lệnh, tước khỏi phần thư mục và hơn nữa xem xét các tập lệnh từ xa có thể mà lệnh tệp máy tính để bàn có thể tham khảo, tìm kiếm chuỗi bắt đầu với "./"

Mặc dù phương pháp này có vẻ hoạt động tốt với tất cả các ứng dụng mà tôi đã thử nghiệm, nhưng tôi có cảm giác phải có một cách dễ dàng hơn để khắc phục vấn đề theo cách "tất cả trong một" ...

Lanhung?

Ngoài ra các đề xuất để nắm bắt các tình huống đặc biệt hơn được chào đón!


Tại sao một ứng dụng sẽ thoát khi biểu tượng của nó bị xóa khỏi trình khởi chạy? Thoát khỏi một ứng dụng không được ghim vào trình khởi chạy sẽ khiến biểu tượng của nó bị xóa, nhưng tại sao việc xóa biểu tượng đó lại thoát khỏi ứng dụng?
Eliah Kagan

@Eliah: bỏ cuộc có lẽ không phải là biểu hiện đúng, ứng dụng chỉ đơn giản là gặp sự cố ....
Jacob Vlijm

@JacobVlijm vậy, đây là Unity cụ thể phải không? Unity đã có cơ chế cho điều đó rồi. Yêu cầu là gì? Chỉ để biết tên quá trình giống như trong psxpropđầu ra?
Sergiy Kolodyazhnyy

@Serg Tên quy trình, "được tính" từ .desktoptệp, không nhất thiết phải là WM_CLASS. WM_CLASS có thể được đặt từ trong ứng dụng.
Jacob Vlijm

@JacobVlijm ah, vì vậy, giả sử bạn đã bắt đầu firefox.desktop, nó khởi chạy firefox với PID 1234, nhưng đã thay đổi WM_CLASSthành một cái gì đó như 'Hoàn toàn không phải Firefox'. Các .desktoptập tin tuy nhiên không thay đổi. Bạn muốn có được tên gắn liền với PID 1234 bất kể WM_CLASS. Tôi nghĩ rằng tôi thấy chính xác những gì cần phải được thực hiện. Nhưng bạn đã không trả lời câu hỏi đầu tiên của tôi - có ổn không nếu nó chỉ dành cho Unity?
Sergiy Kolodyazhnyy

Câu trả lời:


3

Không có cách nào để giải quyết điều này trong trường hợp chung. Bất cứ cơ chế nào bạn đưa ra, tôi tin rằng sẽ luôn có thể viết một quy trình sẽ trốn tránh bạn, trừ khi bạn sửa đổi cách các quy trình được đưa ra ở nơi đầu tiên để theo dõi chúng theo cách đó.

Upstart phải xử lý chính xác cùng một vấn đề để theo dõi nếu daemon vẫn đang chạy, và các tác giả công việc mới bắt đầu phải chỉ định chi tiết (số lượng dĩa) để bắt đầu theo dõi. Cho rằng mới bắt đầu không thể quản lý nó mà không có sự giúp đỡ, tôi cũng không nghĩ rằng bạn có thể. Và mới bắt đầu thậm chí còn kiểm soát cách thức các quy trình được đưa ra, mà tôi không nghĩ rằng bạn đang ở đây.

Tôi nghĩ điều tốt nhất bạn có thể làm là những gì bạn đang làm. Nhìn vào /proc/<pid>/stat/proc/<pid>/cmdlinelà một cách hợp lý chung, nhưng vẫn không nắm bắt được mọi trường hợp. Các pgreplệnh kết thúc tốt đẹp này. Nếu bạn chưa sử dụng pgrep, hãy xem trang web pgrep để biết các tùy chọn về những thứ bạn có thể phù hợp.

Đã nói tất cả những điều đó, tôi không tin rằng bạn thực sự cần phải làm điều này ngay từ đầu. Nếu bạn không thể theo dõi quá trình, thì tôi cũng không thấy Unity có thể làm điều này như thế nào. Không phải là một cách tiếp cận tốt hơn là loại bỏ các sự cố ứng dụng ở nơi đầu tiên? Tôi sẽ xem xét chi tiết lý do tại sao các ứng dụng của bạn bị sập (chắc chắn đó là một lỗi ở đâu đó?), Thay vì cố gắng khắc phục nó như bạn đã mô tả. Tôi tự hỏi nếu điều này chỉ ảnh hưởng đến các ứng dụng nhận biết Unity đang gọi lại cho Unity để có thêm chức năng thông qua DBus ?


Cảm ơn bạn đã trả lời kỹ lưỡng của bạn! Tôi sẽ xem xét chi tiết (đặc biệt là đoạn cuối của bạn) và có thể sẽ cung cấp chức năng "khởi động lại" biểu tượng dưới dạng tùy chọn "thử nghiệm" nếu tôi không thể tìm thấy linh hồn 100%. Tin tốt là trong thời gian đó, tôi không tìm thấy ngoại lệ nào đối với phương pháp tôi đã sử dụng. Một lần nữa xin cảm ơn!
Jacob Vlijm

1

Các xproplệnh (tiếp theo alt-tab để cửa sổ ứng dụng có liên quan, sau đó nhấp vào một lần trong cửa sổ) dường như làm các trick cho tôi.


WM_CLASSthường khớp với tên quy trình, nhưng chắc chắn không phải lúc nào cũng vậy. Xác định (mã hóa) một cửa sổ, tôi có thể cung cấp cho nó bất kỳ thứ gì WM_CLASStôi muốn. Thậm chí, tôi đã tự làm các cửa sổ, chạy từ các quy trình khác nhau, nhóm trong một biểu tượng trình khởi chạy.
Jacob Vlijm

Oh. Thật là xấu hổ. Thật đáng để tôi thêm từ chối trách nhiệm "... dường như là mánh khóe cho tôi" vào cuối. Đó là một chức năng mà tôi thực sự mong đợi sẽ được tích hợp vào hệ điều hành và tôi nghĩ rằng tôi chỉ không biết làm thế nào để làm điều đó. Ít nhất, tôi sẽ mong đợi thông tin trong "Giới thiệu".
el_gallo_azul
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.