У меня должно быть слепое пятно, но я не могу найти, что это такое.
Я сделал небольшой скрипт на Python, который удаляет VLC из звукового меню. Он отлично работает, независимо от того, как я запускаю его с терминала или из программы запуска, или что угодно, о чем вы можете подумать.
На самом деле сценарий не более чем получает текущие настройки:
gsettings get com.canonical.indicator.sound interested-media-players
редактирует список и устанавливает измененный список с помощью:
gsettings set com.canonical.indicator.sound interested-media-players "['newlist']"
Эти команды выполняются сценарием python ,. Однако при запуске из cronjob ( crontab -e
) работает только часть gsettings - get - , но не gsettings - набор - раздел. Я проверил, что секция get отлично работает с cron, заставив скрипт записывать данные (как исходные, так и отредактированные) во внешний файл.
Это не проблема python
Чтобы увидеть, связана ли проблема с кодом python, я создал сценарий bash, который применяет измененный список элементов меню звука. История та же: сценарий bash отлично запускается из командной строки или средства запуска, не из cron, в то время как любая другая команда в том же сценарии будет работать нормально. Кроме того, если я добавьте любую команду в конец приведенного ниже скрипта, он работает нормально и похоже, что скрипт удовлетворен своей собственной работой.
Почему команда gsettings set не работает при запуске из cron?
Это сценарий:
#!/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)