我是第一次使用 crontab。想要编写一些非常简单的测试 cron 任务,并运行它们。
$crontab * * * * * echo "Hi"
不产生任何东西。
crontab */1 * * * * echo "hi"
说*/1: No such file or directory
。
另外,如何列出当前正在运行的 cron 任务(不仅仅是我拥有的任务,还包括其他用户(如 root)启动的任务)。
如何删除特定的 cron 任务?
答案1
你不能crontab
这样使用。用于man crontab
了解调用此实用程序的正确方法。
您将需要用于crontab -e
编辑当前用户的 cron 条目(您可以添加/修改/删除行)。用于crontab -l
查看当前已配置任务的列表。
至于查看其他用户的 crontab,如果没有默认安装的 root 权限,这是不可能的。看如何列出所有用户的所有 cron 作业了解一些列出所有内容的方法(作为 root)。
注意:在命令行(尤其是)上使用 shell 通配符时要非常*
小心?
。*
将扩展到当前目录中的文件列表,这可能会产生意想不到的效果。如果您想将*
其作为参数传递给某些内容,请引用它 ( '*'
)。
答案2
有两种编辑方法crontab
:
以交互方式使用,这将在或指定的编辑器中
crontab -e
打开,或crontab
$VISUAL
$EDITOR
非交互地,使用
crontab crontab.txt
,这将简单地crontab
从文件中导入条目crontab.txt
,替换当前用户现有的活动 crontab。
您遇到的问题是您只是crontab
错误地使用了命令。
以下涉及非交互式 crontab 操作:
所以,为了删除特定任务以编程方式,你可以做类似的事情
$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt
其中PATTERN
是与您要删除的任务相匹配的正则表达式。在这里,crontab -l
将为您提供当前的crontab
.
crontab-fragment.txt
或者,如果您想要从活动的 crontab 中删除名为的文件中的条目,
$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt
这会读取当前的 crontab 并过滤掉(删除)crontab-fragment.txt
当前目录中的文件中也出现的任何行(使用全行字符串比较)。结果被保存到crontab.txt
并从那里加载以替换当前的 crontab。
到添加一项或多项任务,做类似的事情
$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt
这是假设该文件crontab-fragment.txt
包含您要添加的条目。它读取当前的 crontab,将条目附加crontab-fragment.txt
到此并创建crontab.txt
.然后该crontab.txt
文件将替换当前的 crontab。
答案3
这有点晚了,但对于其他在这里看的人来说。有比使用 和 操作输入/输出流更简单的VISUAL
方法EDITOR
。
您可以简单地将 cron 计划写入一个文件中,每行 1 个作业,然后使用该命令,crontab [filename]
以便您可以将cat
作业filename
作为脚本的一部分写入,然后根据需要在最后调用 crontab。
事实上,这是最常见的用法,man crontab
通过列出来作为提示第一的
答案4
如果要以交互方式修改 crontab,请运行命令crontab -e
,不带其他选项。这将在 crontab 的副本上启动编辑器;当你退出编辑器时,编辑后的副本将成为新的 crontab。您可以通过以下方式控制启动哪个编辑器VISUAL
和EDITOR
环境变量。要列出您的 crontab,请运行crontab -l
.
如果要修改脚本中的 crontab,请将VISUAL
和设置EDITOR
为脚本的路径或修改所提供文件的 shell 片段的路径。编辑器ed
在这里是可能的,或者sed -i
如果您的实现sed
有此选项。如果想无条件添加一行,可以使用echo … >>
.注意引用;如果有任何疑问,请编写一个脚本并将脚本名称传递为EDITOR
.
script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]* *[^= ][^ =]* *[^= ][^ =]* *[^= ][^ =]* *[^= ][^ =]* *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF