Issue
Is there a way to remove/delete cron jobs created by Puppet by using awk/sed? I know that we can edit by crontab -e
command manually, but this is a question for scripting.
Example root cron is a file in /var/spool/cron/crontabs/root
. I want to remove lines below.
# Puppet Name: cron1
[email protected],admin@localhost
* * * * * /bin/true
# Puppet Name: cron test
PATH="/usr/local/bin"
[email protected]
2-57 * * * * echo "test"
# Puppet Name: thank you
* * * * * echo "Thank you!"
....
Puppet cron has patterns:
- Begin with
# Puppet Name:
- It can contain Cron Environment or not. This can be multiple lines
If anyone knows how to do it, please help. Thank you!
Solution
You would be well advised to use Puppet to remove the crontab entries that were created by Puppet.
If you have to do it via a manual-ish shell command, however, then you can do it via this sed
command:
sed -nie '/^# Puppet Name:/!{p;d};:p;n;/^[ \t]*\(\|#.*\|[A-Za-z_][A-Za-z_0-9]*[ \t]*=.*\)$/ b p' \
/var/spool/cron/crontabs/root
Explanation
The command assumes that each group of lines to delete starts with a "Puppet Name:" comment and continues up to and including the next line that is neither blank (but for whitespace), nor a comment, nor an environment variable assignment. It modifies the specified file in place (-i
), with auto-printing disabled (-n
). The expression (-e
) does the following:
- If the next line read does not start with the text "
# Puppet Name:
" then print that line and start the next cycle ({p;d}
). Otherwise, - this point in the expression is labelled "p" (
:p
); - silently (because auto-print is disabled) read the next line of input (
n
); - if the current line is blank, is a comment, or is an environment setting then branch to label p (
b p
); - else the end of the expression is reached. Silently (because auto-print is disabled) start the next cycle.
Answered By - John Bollinger Answer Checked By - Clifford M. (WPSolving Volunteer)