Jac*_*ijm 6 scripts cron gsettings
我一定有一个盲点,但我找不到它是什么。
我制作了一个从声音菜单中删除 VLC 的小型 python 脚本。它以我从终端或启动器或您能想到的任何方式运行的任何方式都完美运行。
脚本实际上所做的无非是获取当前设置:
gsettings get com.canonical.indicator.sound interested-media-players
Run Code Online (Sandbox Code Playgroud)
编辑列表,并通过以下方式设置更改的列表:
gsettings set com.canonical.indicator.sound interested-media-players "['newlist']"
Run Code Online (Sandbox Code Playgroud)
这些命令由 python 脚本执行。然而,从一个cronjob运行时(crontab -e
)只有gsettings -得到-部分作品,但不是在gsettings -设置-部分。该获取部分可与cron的罚款,我检查通过制作脚本写数据(原始和编辑的)到外部文件。
不是蟒蛇问题
为了查看问题是否与 python 代码有关,我创建了一个 bash 脚本,该脚本应用了更改后的声音菜单项列表。故事是一样的:bash 脚本可以从命令行或启动器正常运行,而不是从 cron 运行,而同一脚本中的任何其他命令都可以正常运行。此外,如果我在下面的脚本末尾添加任何命令,它工作正常,并且看起来脚本对自己的工作感到满意。
为什么从 cron 启动时gsettings set命令不起作用?
这是脚本:
#!/usr/bin/python3
import subprocess
def read_soundmenu():
# read the current launcher contents
get_menuitems = subprocess.Popen([
"gsettings", "get", "com.canonical.indicator.sound", "interested-media-players"
], stdout=subprocess.PIPE)
return eval((get_menuitems.communicate()[0].decode("utf-8")))
def set_current_menu(current_list): # this takes no effect from cron
# preparing subprocess command string
current_list = str(current_list).replace(", ", ",")
subprocess.Popen([
"gsettings", "set", "com.canonical.indicator.sound", "interested-media-players",
current_list,
])
current_list = read_soundmenu()
for item in current_list:
if item == "vlc.desktop":
current_list.remove(item)
set_current_menu(current_list)
Run Code Online (Sandbox Code Playgroud)
解决方案
事实证明,盲点是我知识上的一个漏洞。不在python 脚本 ( ) 中运行特定命令的原因gsettings set
是 cron 使用了一组非常受限的环境变量。
要从gsettings *set*
cron运行命令(通常),不仅仅是从您的个人 cron 文件运行它;正确执行需要环境变量DBUS_SESSION_BUS_ADDRESS。
出于方便和灵活性的原因,我通过创建一个“中间”脚本,既导出变量又调用实际脚本,解决了这个问题,灵感来自于这篇关于堆栈溢出的帖子中的信息。实际脚本编辑gsettings
。由于(通常)一个进程继承了其父进程的环境,现在脚本运行良好。
#!/bin/bash
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-);/path/to/script.py
Run Code Online (Sandbox Code Playgroud)
(假设 script.py 是可执行的)
在 python 脚本中包含 DBUS_SESSION_BUS_ADDRESS 变量
要gsettings
通过 python 脚本进行编辑,请通过 cron 运行(并且不需要中间脚本),以下函数可以包含在脚本中。它应该gsettings set
在脚本中的函数之前调用。
#!/bin/bash
PID=$(pgrep gnome-session)
export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ|cut -d= -f2-);/path/to/script.py
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1290 次 |
最近记录: |