You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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客户端运行时自动拉取并安装line cookbook

如果不想依赖第三方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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:30:29