Мой сценарий хорошо работает, когда я выполняю его от терминала, но он не работает с кроном. Почему?

Я создаю сценарий для управления моими значками, и я использую команду gvfs-set-attribute чтобы сделать это. Сценарий хорошо работает, когда я выполняю его с терминалом, но ему не удается работать, когда я использую cron. Вот упрощенная версия моей проблемы:

#!/bin/bash

PATH=/home/myUser/bin:/home/myUser/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/myUser/.local/share/gvfs-metadata

gvfs-set-attribute -t string /home/myUser/myFolder metadata::custom-icon file:///home/myUser/myImage.png

Я использовал crontab -e и улаженный мой сценарий для выполнения каждую минуту * * * * * /home/myUser/script.bash. Проблема состоит в том, что этот сценарий не работает вообще, когда я выполняю его с cron.

Я уже записал PATH на моем сценарии, как описано в этой другой проблеме и выводе команды whereis gvfs-set-attribute :

gvfs-set-attribute: /usr/bin/gvfs-set-attribute /usr/share/man/man1/gvfs-set-attribute.1.gz

Так, я предполагаю, что нет ничего неправильно с PATH здесь. Я также попытался запустить свой скрипт непосредственно с полным путем: /usr/bin/gvfs-set-attribute. Но любая из тех вещей работала... Делает у любого есть любая идея того, что происходит и почему я не могу использовать команду gvfs-set-attribute с cron?

2
задан 23 May 2018 в 08:47

2 ответа

Попытайтесь добавить эту строку к своему сценарию (очевидно, перед вызовом к gvfs-set-attribute):

export $(cat /proc/$(pgrep gnome-session)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)

Это берет DBUS_SESSION_BUS_ADDRESS переменная среды от Вашей существующей сессии гнома. Это делает два предположения хотя:

  1. Вы выполняете сессию гнома; и
  2. Существует только одна сессия гнома

Если существует несколько сессий гнома (т.е. один каждый для многочисленных пользователей) можно изменить эту строку для работы на определенного пользователя путем добавления -u опция к pgrep. Например:

export $(cat /proc/$(pgrep gnome-session -u myUser)/environ | grep -z ^DBUS_SESSION_BUS_ADDRESS)

Если Вы не используете гнома - затем я думаю, что это будет работать с другими настольными средами путем замены gnome-session с другим значением - такой как lxsession для LXDE.

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

cron задания не работают под X-оконной системой и обычно не получают доступ к объектам GUI.

Однако можно обмануть.

В терминале, работающем под GUI:

xhost +localhost

echo "export DISPLAY=\"$DISPLAY\"" >$HOME/.display

И, около начала cron задание:

source $HOME/.display

Читать man xhost.

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

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

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