Crontab 没有执行锁定屏幕的命令

Crontab 没有执行锁定屏幕的命令

脚本lck.sh检查是否存在file_name.txt,删除文件并锁定屏幕。当从终端运行脚本时,此操作非常有效。

FILE=/path_to_file/file_name.txt
if test -f "$FILE"; then
    rm $FILE
    /usr/bin/gnome-screensaver-command -l
fi

但是,当 crontab 运行脚本时,文件会被删除,但 gnome-screensaver-command 没有任何效果。crontab 的最后一行内容为:我在 crontab 中附加了以下行

* * * * * sh /etc/profile.d/lck.sh

我使用 ubuntu 16.04

答案1

您的问题是由于“执行环境”的差异造成的。

当您的 shell 脚本“从终端”(在 GUI 环境下)运行时,其执行环境中定义了几个环境变量,这些环境变量指向您尝试锁定的屏幕。

当您从cron(非 GUI 环境)运行时,这些变量未定义,并且/usr/bin/gnome-screensaver-command无法找到要锁定的屏幕。

你可以作弊,通过在脚本的开头 cron定义环境变量,将 GUI 信息传递给你的环境:DISPLAY

# check with echo $DISPLAY in GUI
export DISPLAY=${DISPLAY:-":0"}

您可以通过在每个环境中执行以下命令来比较执行环境:

(echo "=== set ===";set;echo "===env ==="; env | sort;echo "=== alias ===";alias) 

将输出重定向到文件,然后将(diff)与其他环境的结果进行比较。

以下是我了解到的情况/usr/bin/gnome-screensaver-command

walt@bat:~(0)$ strings /usr/bin/gnome-screensaver-command | grep DISPLAY
walt@bat:~(1)$ ldd /usr/bin/gnome-screensaver-command
    linux-vdso.so.1 =>  (0x00007ffdda145000)
    libgio-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007faac6507000)
    libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007faac62b4000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007faac5fa3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faac5bd9000)
    libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007faac59d5000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007faac57bb000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007faac5599000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007faac537e000)
    libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007faac5176000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007faac4f06000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007faac4ce9000)
    /lib64/ld-linux-x86-64.so.2 (0x00007faac688f000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007faac4ae5000)
walt@bat:~(0)$ grep -l DISPLAY /usr/bin/gnome-screensaver-command /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 /lib/x86_64-linux-gnu/libglib-2.0.so.0 /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 /lib/x86_64-linux-gnu/libz.so.1 /lib/x86_64-linux-gnu/libselinux.so.1 /lib/x86_64-linux-gnu/libresolv.so.2 /usr/lib/x86_64-linux-gnu/libffi.so.6 /lib/x86_64-linux-gnu/libpcre.so.3 /lib/x86_64-linux-gnu/libpthread.so.0 /lib/x86_64-linux-gnu/libdl.so.2
/usr/lib/x86_64-linux-gnu/libgio-2.0.so.0
walt@bat:~(0)$ strings /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0 |grep DISPLAY
_u == G_FILE_ATTRIBUTE_ID_STANDARD_DISPLAY_NAME
Cannot autolaunch D-Bus without X11 $DISPLAY
DISPLAY
walt@bat:~(0)$ 

相关内容