У меня есть требование, которое должно завершить работу машины человечности, когда пользователь выходит из системы или закрывает Google Chrome, кто-либо мог дать мне лучшую идею и некоторые детали о том, как сделать это?
Я думаю, что должен записать сценарий оболочки, чтобы контролировать определенные процессы и запустить этот скрипт как задание крона.
Спасибо.
возможно запретить выходу из системы Единицу или сессию Gnome через dbus
- шина межпроцессного взаимодействия, которая позволяет выполнять определенные действия как корень от имени обычного пользователя. В моих тестах кажется, что выходят из системы, является мощным в Единице; это означает, что запрещение только продлится несколько секунд, но это достаточно для нас для выполнения команды завершения работы. Блокировка запрещения также повреждается, после того как пользователь нажимает опцию "Log Out" в диалоговом окне выхода из системы
, сценарий ниже делает точно это. Это выполняет две функции одновременно. Одна функция ожидает Chrome для появления и затем чтобы процессы Chrome закончились и завершили работу. Другая функция, запрещает выход из системы, пока блокировка не повреждается, и после того как блокировка повреждается, это вызывает функцию завершения работы.
Этот сценарий предназначен, чтобы быть добавленным как приложение запуска. Так как необходимо использовать его для каждого пользователя в компании, я предлагаю, чтобы Вы поместили .desktop
файл для этого кода в /etc/xdg/autostart
папка. Тем путем это будет работать за всеми пользователями автоматически
Это также доступно на 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
Для предотвращения пользователя от того, чтобы явно выходить из системы и повреждения блокировки ингибитора используйте
gsettings set com.canonical.indicator.session suppress-logout-menuitem true
, Это удалит опцию выхода из системы, но не удалит ярлык Ctrl+Alt+Del для выхода из системы. Рассмотрите удаление что один также