脚本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)$