V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
aizya
V2EX  ›  Linux

帮忙看看为什么这段脚本放到 crontab 中就运行不了?

  •  
  •   aizya · 2021-05-25 11:36:00 +08:00 · 3118 次点击
    这是一个创建于 1038 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目的是保存最新的 10 条记录,把多余的文件删除,在命令行中是可以运行的.但是放在 crontab 中就执行不了..

    环境是 CentOS7, 麻烦能帮忙指出哪里有问题么?

    * * * * * ls -rt /root/playground/linux/ | head -n -10 | xargs rm -f
    

    还试了

    * * * * * ls -rt /root/playground/linux/ | head -n -10 | xargs -d '\n' rm -f
    
    第 1 条附言  ·  2021-05-25 17:58:58 +08:00
    14 楼提供的方式是可行的, 带了文件的完整路径之后可以删除. 如果不加,crontab 在执行的时候是从根目录去删除,因为根目录没有这些文件,所以不会报错..
    30 条回复    2021-05-27 11:37:46 +08:00
    x1596357
        1
    x1596357  
       2021-05-25 11:42:47 +08:00
    常见的问题是 crontab 的环境中 PATH 是很干净的,最好用绝对路径,比如 head 用 /usr/bin/head 代替。然后 ls 是个内置函数,并不是个程序,所以你可以用 /usr/bin/bash -c "ls -rt /root/playground/linux/ | /usr/bin/head -n -10 | /usr/bin/xargs -d '\n' rm -f"代替
    aladdindingding
        2
    aladdindingding  
       2021-05-25 13:20:37 +08:00
    加载一下 PATH
    aizya
        3
    aizya  
    OP
       2021-05-25 13:58:29 +08:00
    @x1596357 好像并不是这个问题...
    christin
        4
    christin  
       2021-05-25 14:02:48 +08:00 via iPhone
    直接把这段命令放到根目录下运行一次看能运行不
    est
        5
    est  
       2021-05-25 14:06:32 +08:00
    先做成 run.sh 方便调试。
    tusj
        6
    tusj  
       2021-05-25 14:21:48 +08:00
    要么 head -n 10
    guader
        7
    guader  
       2021-05-25 14:32:11 +08:00
    目录有权限吗
    ksc010
        8
    ksc010  
       2021-05-25 14:34:03 +08:00
    在命令 后面添加 >> /tmp/error.log 2>&1
    Beebird
        9
    Beebird  
       2021-05-25 14:35:56 +08:00
    楼主这个是删除最老的 10 个文件啊
    Beebird
        10
    Beebird  
       2021-05-25 14:48:06 +08:00
    没有指定工作目录,这样就可以了,虽然不知道楼主到底是要删除 10 个最老的,还是保留 10 个最新的。。。
    * * * * * cd /root/playground/linux/ && ls -rt /root/playground/linux/ | head -n -10 | xargs rm -f
    Beebird
        11
    Beebird  
       2021-05-25 14:52:03 +08:00
    看了下楼主 head -n -10 是对的 😂 我搞错了
    harwck
        12
    harwck  
       2021-05-25 15:27:08 +08:00
    8 楼为正解
    QHKZ
        13
    QHKZ  
       2021-05-25 15:53:12 +08:00
    cron 有 log,看看 log 怎么说
    hgc81538
        14
    hgc81538  
       2021-05-25 16:41:51 +08:00
    rm 要絕對路徑?

    * * * * * ls -rt /root/playground/linux/ | head -n -10 | awk '{print "/root/playground/linux/" $0}' | xargs rm -f
    neilyoone
        15
    neilyoone  
       2021-05-25 16:47:22 +08:00
    * * * * * 分别代表 分 /时 /日 /月 /周

    你总要设定一个 crontab 执行的时间周期吧?

    比如每分钟执行一次 */1 * * * * CMD
    ysc3839
        16
    ysc3839  
       2021-05-25 16:52:35 +08:00   ❤️ 1
    @x1596357
    首先 ls 不是内置函数。
    https://packages.ubuntu.com/focal/amd64/coreutils/filelist 这里可以看到存在 /bin/ls

    其次 cron 本来就会用 shell 来执行,就算 ls 是内置命令,也是没问题的。
    https://github.com/mirror/busybox/blob/7de0ab21d939a5a304157f75918d0318a95261a3/miscutils/crond.c#L721
    Linys
        17
    Linys  
       2021-05-25 16:58:42 +08:00
    @neilyoone * * * * * 这个是合法的,就是每分钟一次。。。。
    justrand
        19
    justrand  
       2021-05-25 17:26:52 +08:00
    #4 按 4 楼直接先运行一遍命令能不能执行?
    aizya
        20
    aizya  
    OP
       2021-05-25 17:47:48 +08:00
    @christin 确实不行, ls -rt /root/playground/linux/ | head -n -10 这部分可以,但是后面删除没有生效.
    aizya
        21
    aizya  
    OP
       2021-05-25 17:48:26 +08:00
    @justrand 确实不行, ls -rt /root/playground/linux/ | head -n -10 这部分可以,但是后面删除没有生效.
    aizya
        22
    aizya  
    OP
       2021-05-25 17:53:09 +08:00
    @hgc81538 正解,问题应该是要加文件的完整路径.
    lamesbond
        23
    lamesbond  
       2021-05-25 17:59:11 +08:00
    看日志,好像是 /var/spool/mail/用户名
    mangoDB
        24
    mangoDB  
       2021-05-25 19:19:45 +08:00
    看下`man rm`,其中参数`f`有一段解释「 ignore nonexistent files, never prompt 」。

    本应该暴露出来的问题被你隐藏了( doge )。
    zjb861107
        25
    zjb861107  
       2021-05-25 19:54:22 +08:00
    我建议可以尝试下只用 find 命令
    snuglove
        26
    snuglove  
       2021-05-25 19:57:43 +08:00
    施展 cd 大法

    * * * * * cd /root/playground/linux/ && ls -rt | head -10 | xargs rm -f

    直接 find 查询删除最好
    answerwa
        27
    answerwa  
       2021-05-25 22:49:19 +08:00
    看了一下上面的都稍微麻烦了,14 楼还加了一层 awk,试试这个

    ```bash
    * * * * * ls -rt /root/playground/linux/ | head -n -10 | xargs -i rm -f /root/playground/linux/{}
    ```

    > 如果不加,crontab 在执行的时候是从根目录去删除,因为根目录没有这些文件,所以不会报错..
    另外补充一下,这里不是因为根目录没有这些文件不会报错,是因为 rm 加了 -f 参数,错误不会打印出来
    jinliming2
        28
    jinliming2  
       2021-05-25 23:15:00 +08:00
    所以,直接这样呢:

    * * * * * rm `ls -rtd /root/playground/linux/* | head -n -10`
    aizya
        29
    aizya  
    OP
       2021-05-26 10:49:40 +08:00
    @mangoDB 哈哈,确实. 但是加 f 是为了强制删除, 如果不加应该怎么做?
    maxbon
        30
    maxbon  
       2021-05-27 11:37:46 +08:00
    很正常啊,你这路径不全,要写绝对路径,或者提前 cd 到相应目录做操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1123 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:50 · PVG 06:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.