Chef删除指定root cron条目报错,如何精准删除非Chef创建任务
问题描述
现有root用户的crontab内容如下:
[root@server1 ~]# cat /var/spool/cron/root 0 21 * * * /bin/bash -c "sleep $[RANDOM \% 60 + 1]m"; nice -n 10 /opt/snow/snowagent -w /opt/snow/ >/dev/null 2>&1 # Chef Name: account_lister_clean 0 12,23 * * * rm -f /opt/scripts/acct_list_run_once # Chef Name: logger_cron 0 0 * * * /opt/unx_logger.sh
需要通过Chef仅删除其中这一行:
0 21 * * * /bin/bash -c "sleep $[RANDOM \% 60 + 1]m"; nice -n 10 /opt/snow/snowagent -w /opt/snow/ >/dev/null 2>&1
尝试以下代码时出现报错:
delete_lines 'remove snow agent cron at 22:00' do path '/var/spool/cron/root' pattern '^*/opt/snow/snowagent' end
报错信息:
NoMethodError ------------- undefined method `delete_lines' for cookbook: test_lnx_slm9upgrade, recipe: install_slm9 :Chef::Recipe
由于后续会创建同一任务在4:00执行的cron,因此仅需删除21:00执行的/opt/snow/snowagent任务,需解决报错并找到正确的匹配模式。
解决方法
1. 修复delete_lines报错
delete_lines并非Chef原生资源,它属于第三方line cookbook提供的功能,要使用它需完成以下步骤:
- 在你的cookbook的
metadata.rb中添加依赖声明:depends 'line' - 确保通过
berks install或Chef客户端运行时自动拉取并安装linecookbook
如果不想依赖第三方cookbook,可使用Chef原生的ruby_block结合FileEdit实现,示例代码:
ruby_block 'remove 21:00 snow agent cron' do block do cron_file = Chef::Util::FileEdit.new('/var/spool/cron/root') cron_file.search_file_delete_line(/^0 21 \* \* \* .*\/opt\/snow\/snowagent/) cron_file.write_file end end
2. 正确的匹配模式
要精准锁定21:00的目标cron行,正则需同时匹配开头的时间字段和目标命令路径,避免误删其他时间的同任务,推荐模式:
/^0 21 \* \* \* .*\/opt\/snow\/snowagent/
正则说明:
^0 21 \* \* \*:匹配行首的时间规则,*是正则特殊字符,需转义为\*.*:匹配中间任意内容(包含sleep命令部分)\/opt\/snow\/snowagent:匹配目标命令路径,/需转义为\/
若使用line cookbook的delete_lines资源,正确代码如下:
delete_lines 'remove 21:00 snow agent cron' do path '/var/spool/cron/root' pattern /^0 21 \* \* \* .*\/opt\/snow\/snowagent/ end
内容的提问来源于stack exchange,提问作者Hema
相关产品推荐
相关产品推荐

