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!
ps
yxprop
de salida?.desktop
archivo, que no es necesariamente el WM_CLASS. El WM_CLASS se puede configurar desde la aplicación.firefox.desktop
, lanzaWM_CLASS
Firefox con PID 1234, pero cambió a algo como 'Totally Not Firefox'. Sin.desktop
embargo, el archivo no cambia. Desea obtener el nombre adjunto al PID 1234 independientemente deWM_CLASS
. Creo que veo exactamente lo que hay que hacer. Pero no respondiste mi primera pregunta: ¿está bien si es solo para Unity?Respuestas:
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>/stat
y/proc/<pid>/cmdline
es una forma razonablemente general, pero aún no captará todos los casos. Elpgrep
comando envuelve esto. Si aún no lo está utilizandopgrep
, 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 ?
fuente
El
xprop
comando (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í.fuente
WM_CLASS
a menudo coincide con el nombre del proceso, pero definitivamente no siempre. Al definir (codificar) una ventana, puedo darle loWM_CLASS
que quiera. Incluso lo hice yo mismo para hacer que las ventanas, que se ejecutan desde diferentes procesos, se agrupen en un ícono de iniciador.