2 votos

¿Cómo apagar la máquina de ubuntu en otra forma?

¿Tengo un requisito que se necesita para apagar la máquina de ubuntu al usuario cerrar la sesión o cerrar google chrome, podría alguien darme una idea mejor y algunos detalles sobre cómo hacer esto?

Creo que debo escribir un shell script para controlar ciertos procesos y ejecutar este script como de cron.

Gracias.

1voto

Serg Puntos 17677

Contenido:

  1. Ideas generales
  2. Fuente De Secuencias De Comandos
  3. Sugerencias adicionales

1. Ideas generales:

Es posible inhibir la desconexión de la Unidad o sesión Gnome a través de dbus - un bus de comunicación entre procesos que permite la ejecución de ciertas acciones como root en nombre de usuario normal. En mis pruebas, parece que la sesión es contundente en la Unidad; esto significa inhibir sólo va a durar un par de segundos, pero es suficiente para nosotros para ejecutar un comando de apagado. La inhibición de bloqueo también está roto una vez que el usuario hace clic en "cerrar Sesión" en la opción de registro de cuadro de diálogo

enter image description here

El siguiente script hace exactamente eso. Se ejecuta dos funciones simultáneamente. Una función de espera para Chrome para que aparezca y, a continuación, para Chrome procesos que se ha ido y apagado. La otra función , inhibe el cierre de sesión hasta que la cerradura está rota , y una vez que la cerradura está rota llama función de apagado.

Este script está pensado para ser añadido como el arranque de la aplicación. Puesto que se debe utilizar para cada usuario en su empresa, le sugiero que coloque el .desktop archivo para este código en /etc/xdg/autostart carpeta. De esa manera va a estar en ejecución para todos los usuarios de forma automática

2. Fuente de secuencias de comandos

También está disponible en GitHub como gist

/usr/bin/inhibit_logout.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#    Author: Serg Kolo,<1047481448@qq.com>
#    Date: September 28, 2016
#    Purpose: Monitoring script that shutsdown
#             system if logout occurs or chrome exits
#    Written for: http://askubuntu.com/q/828524/295286

from gi.repository import Gdk
import dbus
import os
import threading
import subprocess

def get_dbus(bus_type,obj,path,interface,method,*argv):

    if bus_type == "session":
        bus = dbus.SessionBus() 
    if bus_type == "system":
        bus = dbus.SystemBus()
    proxy = bus.get_object(obj,path)
    method = proxy.get_dbus_method(method,interface)
    if argv:
        return method(*argv)
    else:
        return method()  

def shutdown():
    ''' Wrapper for dbus Shutdown method '''
    get_dbus('session',
             'com.canonical.Unity', 
             '/com/canonical/Unity/Session', 
             'com.canonical.Unity.Session',
             'Shutdown',None)

def is_inhibited():
    ''' wrapper for IsInhibited dbus method'''
    return get_dbus('session',
             'org.gnome.SessionManager', 
             '/org/gnome/SessionManager', 
             'org.gnome.SessionManager',
             'IsInhibited',
             1)

def is_chrome_running():
    '''checks output of pgrep for
       any chrome processes'''
    try:
         null=open(os.devnull,'w')
         subprocess.check_call(['pgrep','-f','chrome'],stdout=null,stderr=null)    
    except subprocess.CalledProcessError:
        return False
    else:
        return True

def inhibit_logout():
    ''' Inhibits log out temporarily so that we have
    enough time to shutdown '''

    # pretend we are root window
    # and inhibit logout on our behalf
    root_window_xid = int(Gdk.Screen.get_default().get_root_window().get_xid())
    get_dbus('session',
             'org.gnome.SessionManager',
             '/org/gnome/SessionManager',
             'org.gnome.SessionManager',
             'Inhibit', 
             'root_window',
             root_window_xid, 
             'TEST REASON', 
             1)

    # once the inhibitor is removed, shutdown
    while is_inhibited():
       pass
    shutdown()    

def capture_chrome():
    # wait for chrome to start
    while not is_chrome_running():
       pass

    # start waiting till it exits
    while is_chrome_running():
       pass

    # once chrome exits, shutdown
    shutdown()

def main():
    ''' program entry point'''
    threading.Thread(target=inhibit_logout).start()     
    threading.Thread(target=capture_chrome).start()

if __name__ == '__main__':
    main()

/etc/xdg/autostart/inhibit_logout.desktop

[Desktop Entry]
Type=Application
Name=Logout Inhibitor
Exec=/usr/bin/inhibit_logout.py
OnlyShowIn=GNOME;Unity;
Terminal=false

3. Sugerencia adicional:

Para evitar que el usuario de forma explícita de inicio de sesión y romper el inhibidor de la cerradura, utilice

gsettings set com.canonical.indicator.session suppress-logout-menuitem true

Esto elimina la opción salir, pero no eliminar Ctrl+Alt+Supr acceso directo para cerrar la sesión. Considere la posibilidad de quitar que uno así

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: