Linux下shell脚本手动执行和放在crontab中自动执行的结果不一样

本文探讨了在CronTab中执行Shell脚本遇到的问题,包括循环执行次数异常、环境变量不一致及注释格式的影响,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我感觉可能是时间读取出错了。 


在脚本最前面加上一句:     source ~/.bash_profile       

http://blog.chinaunix.net/uid-20648405-id-1907334.html


先试一下再run一次看看 。  





问题位置: 
 14 for i in {0..29}
 15 do
 16   num=`printf "%05d\n" $i`
 17   cat shorturl_score/part-$num >> tmp
 18   echo $num
 19 done

在crontab中执行的时候,这个循环居然只执行了一次, 太奇怪了。 

通过1 * * * * (cd ~/a/b/; ./test.sh > t2 2>&1) 后得到错误日志:
  1 printf: 11: {0..29}: expected numeric value
  2 00000
  3 Finished merge 
看样子格式化printf的时候在crontab中行不通,到底为什么呢?   还不知道!!!
 [: 20: Illegal number: {0..29}    

========================
脚本中的环境变量 env > env.log 打出为: 
1 HOME=/home/kk 
2 OLDPWD=/home/kk 
3 LOGNAME=kk 
4 PATH=/usr/bin:/bin 
5 SHELL=/bin/sh 
6 PWD=/home/kk/weibo/a 
明显是很多不同的, 而且PATH少了很多设置。 

因此想办法在shell脚本的开头加上这些东西: 
  1 #!/bin/bash
  2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
                                                               
  3 SHELL=/bin/bash
  4 JAVA_HOME=/usr/lib/jvm/java-6-sun
  5 _=/usr/bin/env
  6 
  7 
  8 env > env.log
  9 . /etc/profile
 10 . ~/.profile
shit! 结果还是失败!!! 



解决办法: ==========================================》
方法一: 
       在/etc/crontab 文件中直接添加我的crontab job任务即可。  但是此法需要root权限才能修改此文件, 在我的本机是可以的;但是我在服务器上面就是不可以了,没有root权限。
方法二: 
        在crontab -e 中的头部加上PATH, 该PATH和命令行下env得到的PATH一样。 
me@server:~/$ crontab -l
# m h  dom mon dow   command
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 


这样的话,上面说的shell脚本头部那一堆垃圾可以都去掉,反正加上去也没有正确的结果。 



参考:

You can also set the PATH variable in the crontab file, which will apply to all cron jobs. E.g.

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root
http://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work 



test.sh这个脚本的crontab任务过了,然后回到项目中的shell脚本中设置还是过不了,检测后对比发觉原来是
头部的这个#后面不能有空格,OMG。。。
#!/bin/bash   




总结
我目前的这个场景下需要注意的两点:
1.crontab -e 编辑个人的crontab job, 在头部加上PATH:
     # m h  dom mon dow   command
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 
2.运行的shell脚本头部的bash注释不能有空格
     # !/bin/bash
     #!/bin/bash

主要问题还是这个头部多了空格!!!

<think>嗯,用户想让我介绍如何编写一个每天定时执行docker system prune -a -f的脚本。首先,我需要确定用户的操作系统,因为同的系统定时任务工具一样,比如Linux用cron,Windows用任务计划程序。过考虑到docker通常用在Linux环境,可能用户是Linux用户,所以先重点讲cron的方法。 然后,我需要解释docker system prune命令的作用,-a是清理所有未使用的镜像,而仅仅是dangling的,-f是强制需要确认。过要注意这个命令的风险,比如可能会删除有用的镜像,所以可能需要提醒用户谨慎使用,或者确认是否真的需要每天执行,因为有时候开发中的镜像可能会被误删。 接下来,编写脚本的步骤。可能需要创建一个shell脚本,比如clean_docker.sh,里面写docker的命令,然后赋予执行权限。再通过crontab -e来添加定时任务,比如每天凌晨执行。这里需要说明cron的语法,比如0 0 * * *表示每天零点执行。 同时,要考虑用户可能对cron熟悉,需要详细说明如何编辑crontab,以及脚本的路径要写绝对路径,避免因为环境变量问题导致执行失败。可能还要提到日志记录,比如将输出重定向到日志文件,方便排查问题。 另外,可能需要提醒用户,如果使用systemd的Linux发行版,比如Ubuntu最新版,可能需要启用cron服务,或者使用systemd timer作为替代方案,但cron更简单通用。 安全方面,要确保用户了解这个命令的影响,特别是生产环境中谨慎使用,可能会影响正在运行的容器,但prune默认会删除正在使用的资源,过-a会删除未使用的镜像,所以如果有镜像虽然没运行但需要保留的,会被删除。建议用户先手动运行确认,再设置定时任务。 最后,检查是否有必要加入错误处理,比如脚本中加入set -e或者错误退出,但用户可能只需要基本功能,所以保持简单。总结步骤:创建脚本,加权限,设置cron任务,测试,注意事项。</think>以下是如何编写一个每日定时清理 Docker 无用资源的脚本及配置方法,分为 Linux Windows 两个版本: --- ### **Linux 系统(使用 cron 定时任务)** #### 1. 创建清理脚本 ```bash # 创建脚本文件 sudo nano /usr/local/bin/clean_docker.sh # 写入以下内容(注意:-a 会删除所有未使用的镜像,谨慎使用!) #!/bin/bash docker system prune -a -f # 保存后赋予执行权限 sudo chmod +x /usr/local/bin/clean_docker.sh ``` #### 2. 配置定时任务 ```bash # 编辑 cron 任务表 sudo crontab -e # 添加以下内容(每天凌晨 3 点执行) 0 3 * * * /usr/local/bin/clean_docker.sh >/dev/null 2>&1 # 重启 cron 服务(部分系统需要) sudo systemctl restart cron ``` --- ### **Windows 系统(使用任务计划程序)** #### 1. 创建清理脚本 ```powershell # 新建文件 clean_docker.ps1,写入内容: docker system prune -a -f ``` #### 2. 配置任务计划 1. 搜索打开 **任务计划程序** 2. 创建任务 > 设置名称(如 "Daily Docker Cleanup") 3. 触发器 > 每天 > 设置时间(如 3:00 AM) 4. 操作 > 启动程序 > 填写: - 程序: `powershell` - 参数: `-ExecutionPolicy Bypass -File "C:\path\to\clean_docker.ps1"` --- ### **注意事项** 1. **数据风险**:`-a` 参数会删除 *所有未被容器使用的镜像*,可能导致需要时重新下载 2. **生产环境慎用**:建议先手动执行确认效果,再设置定时任务 3. **日志记录**(可选):在脚本中添加 `>> /var/log/docker_clean.log` 记录执行结果 4. **资源保留**:如需保留近期镜像,可移除 `-a` 参数,仅清理临时文件 --- ### **替代方案** 考虑使用 `docker system df` 查看空间占用,或指定清理特定资源类型: ```bash # 仅清理容器 docker container prune -f # 仅清理镜像 docker image prune -a -f # 仅清理卷(谨慎!可能含重要数据) docker volume prune -f ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值