web-dev-qa-db-ja.com

ターミナルからスクリプトを実行すると、スクリプトは正常に実行されますが、cronでは機能しません。どうして?

アイコンを管理するスクリプトを作成しており、そのためにコマンド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を指定して実行すると、このスクリプトがまったく機能しないことです。

this 他の問題で説明されているように、スクリプトに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-attributecronと一緒に使用できないのか誰にも分かりませんか?

2
Rafael Muynarsk

次の行をスクリプトに追加してみてください(明らかにgvfs-set-attributeの呼び出しの前):

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

既存のgnome-sessionからDBUS_SESSION_BUS_ADDRESS環境変数を選択します。ただし、これには2つの前提があります。

  1. Gnome-sessionを実行しています;そして
  2. Gnome-sessionは1つだけです

複数のgnome-sessions(つまり、複数のユーザーごとに1つ)がある場合は、-uオプションをpgrepに追加することにより、この行を特定のユーザーに対して機能するように変更できます。例えば:

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

Gnomeを使用していない場合は、gnome-sessionをLXDEのlxsessionなどの別の値に置き換えることで、他のデスクトップ環境でも機能すると思います。

1
Brendan McGrath

cronジョブはXウィンドウシステムでは実行されず、通常はGUIオブジェクトにアクセスしません。

ただし、ごまかすことはできます。

GUIで実行されているターミナルで:

xhost +localhost

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

そして、cronジョブの開始近く:

source $HOME/.display

読んだ man xhost

1
waltinator