как завершить работу машины человечности в другом отношении?

У меня есть требование, которое должно завершить работу машины человечности, когда пользователь выходит из системы или закрывает Google Chrome, кто-либо мог дать мне лучшую идею и некоторые детали о том, как сделать это?

Я думаю, что должен записать сценарий оболочки, чтобы контролировать определенные процессы и запустить этот скрипт как задание крона.

Спасибо.

2
задан 23 September 2016 в 08:37

1 ответ

Содержание:

  1. Общие представления
  2. Источник Сценария
  3. Дополнительные предложения

1. Общие представления:

возможно запретить выходу из системы Единицу или сессию Gnome через dbus - шина межпроцессного взаимодействия, которая позволяет выполнять определенные действия как корень от имени обычного пользователя. В моих тестах кажется, что выходят из системы, является мощным в Единице; это означает, что запрещение только продлится несколько секунд, но это достаточно для нас для выполнения команды завершения работы. Блокировка запрещения также повреждается, после того как пользователь нажимает опцию "Log Out" в диалоговом окне выхода из системы

enter image description here

, сценарий ниже делает точно это. Это выполняет две функции одновременно. Одна функция ожидает Chrome для появления и затем чтобы процессы Chrome закончились и завершили работу. Другая функция, запрещает выход из системы, пока блокировка не повреждается, и после того как блокировка повреждается, это вызывает функцию завершения работы.

Этот сценарий предназначен, чтобы быть добавленным как приложение запуска. Так как необходимо использовать его для каждого пользователя в компании, я предлагаю, чтобы Вы поместили .desktop файл для этого кода в /etc/xdg/autostart папка. Тем путем это будет работать за всеми пользователями автоматически

2. Источник сценария

Это также доступно на GitHub как суть

/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. Дополнительное предложение:

Для предотвращения пользователя от того, чтобы явно выходить из системы и повреждения блокировки ингибитора используйте

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

, Это удалит опцию выхода из системы, но не удалит ярлык Ctrl+Alt+Del для выхода из системы. Рассмотрите удаление что один также

2
ответ дан 2 December 2019 в 03:45

Другие вопросы по тегам:

Похожие вопросы: