注销时使用脚本更改 Gsetting

注销时使用脚本更改 Gsetting

系统

Ubuntu Raring Ringtail (13.04) 全新安装。

目的

主要的:在用户注销时使用脚本更改 gsetting(桌面壁纸)。

我做了什么:(仔细阅读)

我尝试停止名为variety的应用程序(这个登出时我已经将我的解决方法放在里面了。Variety 是一个自动启动应用程序,所以每次我登录时它都会启动。Variety 有一个函数on_quit()force_quit_thread()当应用程序进程停止时会调用它。因此,我在里面添加了我的 python 脚本行,执行我的真实脚本(normalize)。当我尝试正常退出variety时,它会执行我想要的操作!我以为,当系统将我注销时,我启动的任何进程也应该停止。但后来,我意识到,事实并非如此。所以,我不能用这种方式。

这让我想到在注销时使用另一种方式手动终止各种进程。我试过了~/.bash_logout(我对此表示怀疑,因为我知道自动启动不会在 bash 上运行);~/etc/gdm/PostSession/Default(但是,我没有使用 gdm);~/etc/lightdm/lightdm.conf(这个也不起作用!为什么?);pam_script / pam-script(我不知道如何使用它。真的很不一样。)

发生了

但是,当我尝试注销我的帐户时,问题就出现了。它既不执行 on_quit() 也不执行 force_quit_thread()。我从~/nohup.out最后一行捕获的日志如下:

.... bla-bla ... [only see last line]
IOError: [Errno socket error] [Errno 2] No such file or directory

(variety:15627): Gdk-WARNING **: variety: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.

他们失去了可用资源,对吗?未退出正常情况下,这意味着 gsetting 不会改变。

细节

  1. 里面添加了脚本quit functions

    它开着/opt/extras.ubuntu.com/variety/variety/VarietyWindow.py

    bashCommand = "/home/abdillah/Toolbox/command/normalize"
    os.system(bashCommand)
    
  2. normalize 中的脚本

    目的:品种退出时更改壁纸。

    echo $(cat "${HOME}"/.self-log)"| normalize" > "${HOME}"/.self-log #append log
    wallpaper=$(cat /home/abdillah/.wallpaper)
    filename="file://"$wallpaper
    configname=${filename/'#'/"%23"}
    gsettings set org.gnome.desktop.background picture-uri $configname #the most important
    
  3. LightDM 配置文件

    让我困惑的是文档,没有提到声明session-cleanup-script。它已被弃用?

    [SeatDefaults]
    user-session=ubuntu
    greeter-session=unity-greeter
    autologin-user=
    session-cleanup-script=/home/abdillah/Toolbox/command/logoff
    
  4. 注销文件包含:

    .self-log 文件仍为空 => 失败

    #!/bin/bash
    echo $(cat "${HOME}"/.self-log)" |fail? (OnScript)" > "${HOME}"/.self-log #append log
    killall variety
    /opt/extras.ubuntu.com/variety/bin/variety -q
    echo $(cat "${HOME}"/.self-log)" |Success? (OnScript)" > "${HOME}"/.self-log #log
    exit 0
    

问题

当任何人认为上述条件非常具体时,只需回答以下问题。

  1. 如何在注销时直接执行脚本(中美贸易战上述方法。如果没有,请提出任何建议),或者
  2. 当我退出时,如何正确停止多样性?(因此调用 on_quit())

可能的解决方案

  • 使用 [StartUpApplication] 启动各种程序,in bash并使用 ~/.bash_logout 脚本停止。但是,如何停止呢?

好吧,很长。但是,我尽量说得清楚。因为我读过很多与此相关的问题。

答案1

解决方案并不简单。它需要在 X 登录时启动脚本并等待 X 会话结束。幸运的是,我们有 inotify 和 gnome-session 的 pid。

在脚本执行时,各种进程应该已经被正确终止。

  1. 安装inotify-tools包。
  2. 创建或修改 ~/.xprofile 脚本并在其中添加以下行

    sh .xlogout &
    
  3. 创建 ~/.xlogout 并包含以下内容

    FILE=/tmp/.ICE-unix/$PPID            # pid of parent = gnome-session
    sleep 10s                            # wait for $FILE creation
    inotifywait -qe delete_self $FILE    # wait for $FILE deletion = logout
    # your code goes here                # = on_quit
    # gsettings reset org.gnome.desktop.background picture-uri
    

相关内容