Esta es la secuencia de comandos, gedit
se inicia, pero no se puede eliminar desde su ID de proceso
$ gedit&
$ t=$!
$ echo $t
4824
$ kill $t
bash: kill: (4824) - No such process
Funcionaría bien para un sleep
proceso, como
sleep 999&
[1] 4881
$ t=$!
$ echo $t
4881
$ kill $t
$ ps -p $t
[1] Terminated sleep 999
¿Cual es la diferencia? ¿Cómo puede el gedit
el proceso sea terminado?
Respuesta aceptada:
El gedit
el proceso ya está rescindido.
Recuerde cómo las aplicaciones de Windows funcionaban principalmente en Win16 días antes de que Win32 apareciera y lo eliminara:donde había hInstance
y hPrevInstance
, intentar ejecutar una segunda instancia de muchas aplicaciones simplemente pasaba las cosas a la primera instancia, y esto dificultó las cosas para las herramientas de secuencias de comandos (como Take Command) porque uno invocaría una aplicación por segunda vez, estaría visiblemente allí en el pantalla como una ventana añadida, pero en lo que respecta al intérprete de comandos, ¿el proceso secundario que acababa de ejecutar salió inmediatamente?
Bueno, GNOME ha recuperado el comportamiento de Win16 para Linux.
Con aplicaciones GIO como gedit
, la aplicación se comporta de la siguiente manera:
- Si no hay un "servidor" registrado llamado
org.gnome.gedit
ya en el Desktop Bus por usuario/por inicio de sesión,gedit
decide que es la primera instancia. se convierte elorg.gnome.gedit
servidor y continúa ejecutándose. - Si hay un "servidor" registrado llamado
org.gnome.gedit
ya en el Desktop Bus por usuario/por inicio de sesión,gedit
decide que es una segunda o posterior instancia. Construye mensajes de Desktop Bus a la primera instancia, pasando a lo largo de sus opciones y argumentos de línea de comando, y luego simplemente sale .
Entonces, lo que ves depende de si tienes el gedit
servidor ya funcionando. Si no lo ha hecho, estará en el lugar de sebvieira y se preguntará por qué no está viendo el comportamiento descrito. Si es así, estará en su lugar y verá el gedit
el proceso finaliza casi de inmediato, especialmente porque no le ha dado ninguna opción de línea de comandos o argumentos para enviar a la "primera instancia". De ahí la razón por la que ya no hay un proceso con esa ID.
Se produce mucha diversión cuando, como se mencionó anteriormente, el Bus de escritorio por inicio de sesión se cambia al estilo "nuevo" de un Bus de escritorio por usuario, y de repente no hay una relación 1:1 entre un Bus de escritorio y una pantalla X. más. De repente, las aplicaciones de instancia de bus de usuario único tienen que ser capaces de comunicarse con varias pantallas X al mismo tiempo.
Se produce más hilaridad cuando las personas intentan ejecutar gedit
como superusuario a través de sudo
, ya que no puede conectarse a un bus de escritorio por usuario o se conecta al bus de escritorio incorrecto (del superusuario).
Hay una propuesta para dar gedit
una opción de línea de comandos que hace que el proceso que se invoca sea solo la aplicación de edición real , de modo que gedit
sería útil como el editor señalado por el EDITOR
variable de entorno (que no es para muchos usos comunes de EDITOR
, desde crontab
a git
, cuando acaba de salir inmediatamente). Esta propuesta aún no se ha hecho realidad.
Mientras tanto, las personas tienen varias formas de tener una segunda instancia simple de un "editor de texto liviano", como invocar una instancia de Desktop Bus completamente nueva, privada para la invocación de gedit
, con dbus-run-session
. Por supuesto, esto tiende a activar otros servidores GNOME Desktop Bus en este bus privado, ya que a su vez son invocados por gedit
, por lo que no es "ligero" en absoluto.
La guinda del pastel es cuando ha seguido esta recomendación o una similar e interpuesto una función de shell llamada gedit
que elimina inmediatamente el gedit
proceso de la lista de trabajos del shell. El proceso no solo termina rápidamente para que no lo veas más tarde con kill
o ps
, pero el shell ni siquiera lo supervisa como un trabajo controlado por shell.
Lecturas adicionales
- Aplicaciones/Gedit/Nueva instancia única. wiki de gnomos. 2013.
- “Descripción“.
GApplication
. Wiki de desarrolladores de GNOME. - https://stackoverflow.com/questions/7553452/
- Stefan Löffler (2011-05-04). no reutiliza la instancia en ejecución cuando se inicia desde nautilus. Error #777292. Plataforma de lanzamiento.