帮忙看看为什么这段脚本放到 crontab 中就运行不了? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
aizya
V2EX    Linux

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

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

    目的是保存最新的 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 * * * * * 这个是合法的,就是每分钟一次。。。。
    yEhwG10ZJa83067x
        19
    yEhwG10ZJa83067x  
       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 )。
    edsion996
        25
    edsion996  
       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     Solana     3549 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 68ms UTC 00:08 PVG 08:08 LAX 17:08 JFK 20:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86