我已经成功地将我的一些 cron 作业迁移到了 systemd。我遵循了一些指南,并采用了创建 3 个文件的标准方法:
myjob.timer - systemd timer unit
myjob.service - systemd service unit
myjob.sh
Run Code Online (Sandbox Code Playgroud)
正如您可能猜到的那样,在某个时间触发 myjob.timer,它运行 myjob.service,然后执行 myjob.sh。
我的所有计时器都具有相同的设置,现在我看到一切正常,我想禁用 myjob.timer,它只是一个测试器。
我只是做:
systemctl --user disable myjob.timer
Run Code Online (Sandbox Code Playgroud)
还是我还必须做:
systemctl --user disable myjob.service
Run Code Online (Sandbox Code Playgroud)
正确的做法是什么?我对 systemd 很陌生,所以我想学习如何以正确的方式做事。我猜测禁用这两个单元是正确的,以保持系统没有超额行李运行。
我正在学习 CentOS/RHEL,目前正在做一些关于进程管理的工作。
我正在阅读的 RHCSA 书将运行描述kill 1234
为发送 SIGQUIT。我一直认为不添加信号类型开关的 kill 命令应该默认为kill -15
SIGTERMkill -15
和 SIGKILL 是kill -9
,对吧?
CentOS/RHEL 是否使用了稍微不同的方法 kill -15
或者我只是弄错了?
编辑:kill -l
给 SIGQUIT askill -3
并且它似乎与使用键盘终止进程有关。man 7 signal
还指出 SIGQUIT 是kill -3
,所以我只能假设我的书错误地指出 SIGQUIT 是kill -15
默认值。
我尝试删除我的 .gnupg 目录,但错误返回。
我明白了:
gpg: lookup_hashtable failed: eof
gpg: lookup_hashtable failed: eof
gpg: upd_hashtable: read failed: eof
gpg: trust record 2, type 12: write failed: eof
gpg: Error: The trustdb is corrupted.
gpg: You may try to re-create the trustdb using the commands:
gpg: cd ~/.gnupg
gpg: gpg2 --export-ownertrust > otrust.tmp
gpg: rm trustdb.gpg
gpg: gpg2 --import-ownertrust < otrust.tmp
gpg: If that does not work, please consult the manual
Run Code Online (Sandbox Code Playgroud)
我尝试遵循错误抛出的建议,但这也不起作用。尝试谷歌搜索问题,但没有出现“lookup_hastable”。
我还安装了 seahorse 并将我的 ssh 密钥存储在 seahorse 中。海马会发生冲突吗?
我gpg --gen-key …
我家庭网络上的其中一台 PC 的主机名是“3770k”,因为这是它的 CPU 型号。
我通常输入 'ssh 3' 并点击 Tab 来自动完成连接。
我刚刚意识到我现在有两个以 3 开头的条目:我的常规 3770k 一个和 35.156.197.162。
它出现在我尝试 ssh、scp 和 rsync 时。它可以追溯到密歇根州的安娜堡。我在英国,从未有意连接到密歇根州的 PC。
知道我做了什么吗?是否有我可能不小心将这个地址附加到的配置文件?我查看了 ~/.ssh/config 并且它不存在。我没有不小心创建了一个以 IP 命名的文件。如果我尝试 ping 这个神秘地址,我不会收到任何回复。
如果我用 ssh 自动完成它,后面会有一个冒号,所以我的电脑似乎认为它是一个网络位置。
我一直在将我的 crontab 迁移到 systemd 的计时器单元。它们看起来都类似于:
.timer 文件:
[Unit]
Description=timer that uses myjob.service
[Timer]
OnCalendar=*-*-* *:00:00
Unit=myjob.service
[Install]
WantedBy=timers.target
Run Code Online (Sandbox Code Playgroud)
.service 文件:
[Unit]
Description=Script that runs myjob.sh
[Service]
ExecStart=/home/user/myjob.sh
Run Code Online (Sandbox Code Playgroud)
我的计时器可以工作,但它们也会在系统重新启动时执行。我希望我的 OnCalendar 事件只在指定的时间运行,而不是在我重新启动 PC 的任何随机时间运行。有任何想法吗?
更新:我通过将我的“用户”计时器转换为根/系统计时器解决了这个问题。
我禁用了所有 .service 和 .timer 文件,并将它们从我的主目录中移到 /etc/systemd/system 中。
我在每个服务文件中添加了“用户 =”部分,以便我的脚本由普通用户而不是 root 用户运行。
现在我的计时器没有在系统启动时被触发,当我通过 ssh 登录时,我也遇到了偶发触发的问题。现在这也已解决,因为它们受 root 帐户的控制,但运行我的脚本仍然作为普通用户的 PID 运行,这保留了我的文件的所有权属性。问题解决了。