仅当条目不存在时才附加到 crontab

仅当条目不存在时才附加到 crontab

我正在寻找一种编程方式,仅当条目不存在时才将其附加到 crontab。此外,退出代码必须适用0于条目不存在或条目存在两种情况。

我试过:

(crontab -l -u root 2>/dev/null | grep -F -v "@reboot /usr/bin/mycommand" || true; echo "@reboot /usr/bin/mycommand 2>&1") | sudo crontab -u root -

(crontab -l -u root 2>/dev/null | grep -F -v "@reboot /usr/bin/mycommand_2" || true; echo "@reboot /usr/bin/mycommand_2 2>&1") | sudo crontab -u root -

但是第二个仍然覆盖了 crontab 中的所有内容。

答案1

未经测试,因此请谨慎

entries=( 
    "@reboot /usr/bin/mycommand"
    "@reboot /usr/bin/mycommand_2"
)
to_add=()
f=$(mktemp)

crontab -u root -l > "$f"
for entry in "${entries[@]}"; do
    grep -qF "$entry" "$f" || to_add+=( "$entry" )
done

{ cat "$f"; printf "%s\n" "${to_add[@]}"; } | crontab -u root "$f"
rm "$f"

您的解决方案仅打印新条目。使用tee进程替换将包括原始 crontab 以及可能的新条目:

crontab -l -u root 2>/dev/null | tee >(sh -c '
    grep -qF "@reboot /usr/bin/mycommand" || echo "@reboot /usr/bin/mycommand 2>&1"
') | sudo crontab -u root -

相关内容