¿Cómo determino el nombre del proceso de una aplicación?

13

Esta es la situación:

Trabajando en (la próxima versión de) un editor de Lista rápida de Unity, me gustaría agregar una forma confiable de "reiniciar" los iconos de inicio. Para hacerlo, necesito eliminar el ícono (editar ajustes) y reemplazarlo en la misma posición. Hasta ahora no hay problema. Sin embargo, si la aplicación en cuestión se está ejecutando, el usuario posiblemente perderá datos, ya que la aplicación se cerrará cuando se elimine su icono del iniciador. Lo que necesito es una forma confiable de encontrar el nombre del proceso de una aplicación, para permitir que el editor verifique en la lista de procesos en ejecución si la aplicación se está ejecutando, y envíe un mensaje de advertencia al usuario de que el icono no se puede reiniciar si la aplicación está corriendo.

Lo que hice hasta ahora es hacer que el editor revise el archivo de escritorio, lea el comando, también lea el comando, se elimine de la sección del directorio y, además, busque posibles scripts remotos a los que el comando del archivo de escritorio pueda referirse, buscando cadenas que comiencen con "./"

Aunque el método parece funcionar bien con todas las aplicaciones en las que lo probé, tengo la sensación de que debe haber una manera más fácil de resolver el problema de una manera "todo en uno" ...

¿Esta ahí?

¡También se aceptan sugerencias para atrapar situaciones más excepcionales!

Jacob Vlijm
fuente
¿Por qué se cerraría una aplicación cuando se elimine su icono del iniciador? Salir de una aplicación que no está anclada en el iniciador hace que se elimine su ícono, pero ¿por qué si se quita el ícono se cierra la aplicación?
Eliah Kagan
@Eliah: dejar de fumar probablemente no sea la expresión correcta, la aplicación simplemente falla ...
Jacob Vlijm
@JacobVlijm entonces, esto es específico de Unity ¿verdad? La unidad ya tiene un mecanismo para eso. ¿Cuáles son los requisitos? Sólo para saber el nombre del proceso mismo que en el psy xpropde salida?
Sergiy Kolodyazhnyy
@Serg El nombre del proceso, "calculado" a partir del .desktoparchivo, que no es necesariamente el WM_CLASS. El WM_CLASS se puede configurar desde la aplicación.
Jacob Vlijm
@JacobVlijm ah, así que suponga que comenzó firefox.desktop, lanza WM_CLASSFirefox con PID 1234, pero cambió a algo como 'Totally Not Firefox'. Sin .desktopembargo, el archivo no cambia. Desea obtener el nombre adjunto al PID 1234 independientemente de WM_CLASS. Creo que veo exactamente lo que hay que hacer. Pero no respondiste mi primera pregunta: ¿está bien si es solo para Unity?
Sergiy Kolodyazhnyy

Respuestas:

3

No hay forma de resolver esto en el caso general. Independientemente del mecanismo que se le ocurra, creo que siempre será posible escribir un proceso que lo eludirá, a menos que modifique la forma en que se inician los procesos para rastrearlos de esa manera.

Upstart tiene que lidiar exactamente con el mismo problema para rastrear si los daemons aún se están ejecutando, y los autores de trabajos novatos tienen que especificar los detalles (el número de bifurcaciones) para que el upstart los rastree. Dado que el advenedizo no puede manejarlo sin ayuda, tampoco creo que pueda hacerlo. Y el advenedizo incluso controla la forma en que se inician los procesos, que no creo que esté aquí.

Creo que lo mejor que puedes hacer es lo que ya estás haciendo. Mirar /proc/<pid>/staty /proc/<pid>/cmdlinees una forma razonablemente general, pero aún no captará todos los casos. El pgrepcomando envuelve esto. Si aún no lo está utilizando pgrep, eche un vistazo a la página de manual de pgrep para ver las opciones con las que puede hacer coincidir.

Habiendo dicho todo eso, no estoy convencido de que realmente necesites hacer esto en primer lugar. Si no puede rastrear el proceso, tampoco veo cómo Unity podría hacer esto. ¿No sería un mejor enfoque eliminar los bloqueos de la aplicación en primer lugar? Examinaría los detalles de por qué sus aplicaciones se bloquean (¿seguramente eso es un error en alguna parte?), En lugar de tratar de solucionarlo como usted ha descrito. Me pregunto si esto sólo afecta a las aplicaciones Unity-conscientes, que están llamando de nuevo a la Unidad para la funcionalidad adicional a través de Enlace con el Bus ?

Robie Basak
fuente
Gracias por tu respuesta completa! Examinaré los detalles (especialmente su último párrafo), y probablemente ofreceré la función de "reinicio" del icono como una opción "experimental" si no puedo encontrar una soulution 100%. La buena noticia es que, mientras tanto, no encontré excepciones en el método que utilicé. ¡Gracias una vez más!
Jacob Vlijm
1

El xpropcomando (seguido de alt-tab a la ventana de la aplicación relevante, luego haga clic una vez en la ventana) parece hacer el truco para mí.

el_gallo_azul
fuente
WM_CLASSa menudo coincide con el nombre del proceso, pero definitivamente no siempre. Al definir (codificar) una ventana, puedo darle lo WM_CLASSque quiera. Incluso lo hice yo mismo para hacer que las ventanas, que se ejecutan desde diferentes procesos, se agrupen en un ícono de iniciador.
Jacob Vlijm
Oh. Es una pena. Valió la pena agregar el descargo de responsabilidad "... parece hacer el truco para mí" al final. Es una función que realmente esperaba que se integrara en el sistema operativo, y pensé que simplemente no sabía cómo hacerlo. Como mínimo, esperaría la información en "Acerca de".
el_gallo_azul