como desligar a máquina Ubuntu de outra maneira?

2

Eu tenho um requisito que precisa desligar a máquina ubuntu quando o usuário sair ou fechar o Google Chrome, alguém poderia me dar uma idéia melhor e alguns detalhes sobre como fazer isso?

Acho que devo escrever um script de shell para monitorar certos processos e executar esse script como cron job.

Obrigado.

    
por wufengyi 23.09.2016 / 07:37

1 resposta

2

Conteúdo:

  1. Ideias gerais
  2. Fonte de script
  3. Sugestões adicionais

1. Ideias gerais:

É possível inibir o logout da sessão do Unity ou Gnome via dbus - um barramento de comunicação entre processos que permite a execução de determinadas ações como root em nome do usuário comum. Nos meus testes, parece que o logout é strong em Unity; Isso significa que a inibição durará apenas alguns segundos, mas é o suficiente para executarmos um comando de desligamento. O bloqueio de inibição também é interrompido quando o usuário clica na opção "Logout" na caixa de diálogo de logout

Oscriptabaixofazexatamenteisso.Eleexecutaduasfunçõessimultaneamente.UmafunçãoaguardaaexibiçãodoChromee,emseguida,odesaparecimentoeoencerramentodosprocessosdoChrome.Aoutrafunçãoinibe ologoutatéqueobloqueiosejaquebrado,eumavezqueobloqueioéquebrado,elechamaafunçãoshutdown.

Estescriptdeveseradicionadocomoaplicativodeinicialização.Comovocêdeveusá-loparacadausuáriodasuaempresa,sugirocolocaroarquivo.desktopdessecódigonapasta/etc/xdg/autostart.Dessaforma,eleseráexecutadoparatodososusuáriosautomaticamente

2.Fontedescript

Eletambémestádisponívelem GitHub como essência

/usr/bin/inhibit_logout.py

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

#    Author: Serg Kolo,<[email protected]>
#    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. Sugestão adicional:

Para impedir que o usuário efetue logout e interrompa explicitamente o bloqueio do inibidor, use

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

Isso removerá a opção de logout, mas não removerá o atalho Ctrl + Alt + Del para o logout. Considere removê-lo também

    
por Sergiy Kolodyazhnyy 28.09.2016 / 20:13