我已经设置了这样的 crontab 任务:
@reboot xmodmap -e \"keycode 105=Delete\"
@reboot xmodmap -e \"keycode 66=Home\"
并保存在 NANO ( ) 建议的默认目录中/tmp/..../.../cron
,但它不起作用。我可以列出 cron 作业,cron 服务正在运行,输出journalctl -b 0 _SYSTEMD_UNIT=cron.service
显示没有错误的作业等等。除此之外,我也无法在启动时运行脚本:@reboot /home/user/scripts/myscript.sh
为什么cron
没有按照我预期的那样工作?
答案1
xmodmap 修改当前会话的键码映射。因此,如果您在 crontab 中运行它,它会打开一个会话,修改映射并再次关闭该会话 - 其效果就消失了。
您应该在您的配置文件中运行 xmodmap 命令$HOME/.profile
(或者,$HOME/.xinitrc
如果您仅在登录时启动 X 会话,则在您的配置文件中运行 xmodmap 命令)。
man xmodmap
说:
它通常从用户的会话启动脚本运行,以根据个人喜好配置键盘。
答案2
看一眼man cron
或 Internet 上的其他示例。我认为您遇到的问题是没有使用二进制文件的完整路径。
| melon@pc ~>$ which xmodmap
/usr/bin/xmodmap
在你的 中,你会放入 ,cron -e
而不是。xmodmap
/usr/bin/xmodmap
但是,即使有这种变化,您也不会看到任何关键的变化。
Linux 的优点在于它提供了各种问题解决方案,但请研究其他人如何解决类似问题。例如,xmodmap
通常在中调用.xinitrc
,它会在您的 X 会话启动时执行。 xmodmap
实际上不会按您尝试的方式工作,至少对于您的普通用户来说是这样。
既然你感兴趣xmodmap
,我建议你看看文档和示例并完全忘记cron
当前这个问题。
如果您不愿意查看文档和其他示例,或者想要真正了解事物的工作原理,您可以查阅以下页面man
:
XMODMAP(1) General Commands Manual XMODMAP(1)
NAME
xmodmap - utility for modifying keymaps and pointer button mappings in X
SYNOPSIS
xmodmap [-options ...] [filename]
DESCRIPTION
The xmodmap program is used to edit and display the keyboard modifier map and keymap table
that are used by client applications to convert event keycodes into keysyms. It is usually
run from the user's session startup script to configure the keyboard according to personal
tastes.
最后一句话回答了你的问题。
此时,您不知道cron
它是否不起作用(这是您的怀疑),或者是否xmodmap
被触发,但您看不到效果。后者是可能的情况。您的用户需要xmodmap
在当前 X 会话中执行才能xmodmap
使更改生效。
一旦你在xmodmap
没有 的情况下工作cron
,你就可以解决下一个问题。如前所述,你需要完整的系统路径,但你还需要告诉cron
如何运行文件。您只是指向了文件,它在您的终端上运行,因为它使用了 shebang/解释器(即:)#!/bin/bash
。因此,要cron
运行bash
文件...
| melon@nifflheim ~>$ which bash
/usr/bin/bash
| melon@nifflheim ~>$ crontab -e
...
@reboot /usr/bin/bash /home/user/scripts/myscript.sh
但是,你真的想root
运行在用户目录中找到的脚本吗?根据你目前所学的知识,也许你可以添加/usr/bin/bash /home/user/scripts/myscript.sh
(或source
它)~/.xinitrc
^_~。