Window shell文件在linux系统下执行不了的解决办法
一些人喜欢用vim来写linux shell script, 但是, 有的人喜欢在Windows下用一些方便的编辑器(比如鼎鼎大名的Notepad++)写好, 然后拷贝文件到linux下, 结果呢, 在执行脚本a.sh的时候, 会出现如下问题:
[taoge@localhost learn_shell]$ ./a.sh
bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory
[taoge@localhost learn_shell]$
什么原因呢, 我们有理由怀疑是文件格式问题? 我们用vim a.sh进入a.sh这个文件, 然后在底部模式下, 执行:set ff查看一下, 结果发现fileformat=dos, 看看, 果然是文件格式问题, 那怎么解决呢?
方法一:vim a.sh进入a.sh后, 在底部模式下, 执行:set fileformat=unix后执行:x或者:wq保存修改。 然后就可以执行./a.sh运行脚本了。(我亲自试过, 是ok的)
方法二:直接执行sed -i "s/\r//" a.sh来转化, 然后就可以执行./a.sh运行脚本了。(我亲自试过, 是ok的)
方法三:直接执行dos2unix a.sh来转化, 然后就可以执行./a.sh运行脚本了。(我的linux上执行dos2unix ./a.sh失败, 但是不要放弃啊, 加个busybox就可以了), 如下:
dos2unix a.sh
bash: dos2unix: command not found
[taoge@localhost learn_shell]$ busybox dos2unix a.sh
[taoge@localhost learn_shell]$
实际上, 经过上述三种方法修改后, 我们都可以再用:set ff再查一下, 发现a.sh的fileformat果然是unix了。 第三种方法最方便, 建议用第三种!
执行定时任务的步骤(使用crontab,让linux定时执行shell脚本)
使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令。例如系统管理员安排一个备份任务使其每天都运行
入门
# crontab –e
这样可以已编辑模式打开个人的crontab配置文件,然后加入一下这行:
0 0 * * * /home/linrui/XXXXXXXX.sh
这将会在每天凌晨运行 指定的.sh文件
Cron 各项的描述
以下是 crontab 文件的格式:
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
o minute: 区间为 0 – 59
o hour: 区间为0 – 23
o day-of-month: 区间为0 – 31
o month: 区间为1 – 12. 1 是1月. 12是12月.
o Day-of-week: 区间为0 – 7. 周日可以是0或7.
Crontab 示例
1、在 凌晨00:01运行
1 0 * * * /home/linrui/XXXX.sh
2、每个工作日23:59都进行备份作业。
59 11 * * 1,2,3,4,5 /home/linrui/XXXX.sh
或者如下写法:
59 11 * * 1-5 /home/linrui/XXXX.sh
3、每分钟运行一次命令
*/1 * * * * /home/linrui/XXXX.sh
4、每个月的1号 14:10 运行
10 14 1 * * /home/linrui/XXXX.sh
Crontab命令的选项
以下是 crontab 的有效选项:
crontab –e : 修改 crontab 文件. 如果文件不存在会自动创建。
crontab –l : 显示 crontab 文件。
crontab -r : 删除 crontab 文件。
crontab -ir : 删除 crontab 文件前提醒用户。
ThinkPHP实现定时任务
项目服务端框架我选用的是ThinkPHP,由于策划案中有需求要定时刷新指定数据,所以在windows平台我使用微软的计划任务调用bat脚本来执行下面的命令来完成
php index.php /Home/cli
即使用PHP的CLI模式调用ThinkPHP的入口文件,然后再传入指定控制器完成相应的数据处理。/Home/cli 为我新增的名为CliController的控制器,在类中index方法调用相应处理数据的模块即可。特别注意:在windows平台上执行时在bat脚本中一定要先将当前执行目录切换到index.php所在目录,然后执行php.exe index.php /Home/cli.
在linux平台下使用的crontab来实现定时任务,通过crontab -e 新增一条命令,具体写法可问问度娘,给出我的配置截图:
# m h dom mon dow command
* * */bin/sh /mnt/share/Web/Cli_timer.sh
效果就是每天早上6点执行cli_timer.sh脚本,脚本内容如下:
sh -c "cd /mnt/share/WebServer;php index.php /Home/Cli;"
这里需要说明的是在linux下如果cli_timer.sh脚本中只包含下面命令
php index.php /Home/Cli;
是会报路径包含错误的,所以这里在脚本中将当前工作路径切换到index.php脚本放置的目录,这样就能正常使用了。
ubuntu上使用cron执行定时任务计划
在ubuntu下,cron为自带的系统服务。
任意用户下,输入“crontab -e”即可进入任务编写。相关提示大致如下:
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at a.m every week with:
# * * tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab() and cron()
#
# m h dom mon dow command
如果是第一次执行“crontab -e”,会提示选择编辑器,选择合适的编辑器即可。我选择的是“4”,vim。
Select an editor. To change later, run 'select-editor'.
. /bin/ed
. /bin/nano <---- easiest
. /usr/bin/vim.basic
. /usr/bin/vim.tiny Choose - []:
然后,在最后面添加下面内容,然后保存并退出。
# test
* * * * date >>/tmp/test.txt
至于上面这个表达式的说明,请各看官自行度娘或谷歌。
好了,去看看“/tmp/test.txt”是否有内容吧。
下面是我期间遇到的几个问题。
1.输入“crontab -e”,提示“no crontab for root - using an empty one”
处理:这个是正常的,提示你,当前设定的用户,没有cron任务。
2.输入“crontab -e”,输入内容后,退出时,提示保存;保存后,任务不能成功添加。
处理:你选择的编辑器有问题。请在root角色下输入“select-editor”,可以重新进行选择。
3.编辑完任务并保存后,重启服务的问题。
有些网文说是“service crond restart”进行服务重启,在这里,需要特别注意的是,在ubuntu下cron服务的重启应该是“service cron restart ”。注意,是“cron”,而不是“crond”。
Ubuntu使用crontab定时任务
因为今天想定时执行postgres的一些脚本,所以在网上查一下有一个crontab的命令,就把这个命令的使用记录一下,方便日后查找.
cron是一个[守护程序]用于在指定的时间内执行行程类的任务,每一个用户都有一个 crontab 文件,来允许他们指定需要执行的内容和时间,此外,系统也有一个 crontab ,用来允许像交替日志和更新本地数据这样有规则的任务。
环境:Ubuntn 12.10
1.使用 crontab -e命令
这个命令比较简单直接输入就可以
#:crontab -e
出现如下窗口(第一次会提示你用那个编译器,随便选 一个就行了)
之后就可以输入你想执行的内容了.
比如:*/2 * * * * date >> /home/postgres/time.log 它的意思就是每过两分钟就向time.log文件中写入当然的系统时间.
之后ctrl+X退出保存就行了.
2.保存crontab之后,我们还要重启crontab服务来使这个任务生效.
sudo service cron restart
3.看一下结果
vim /home/postgres/time.log
参数说明(我找的很多例子,看看就明白了.)
# m h dom mon dow command
m 分钟 0-59
h 小时 0-23
dow 天1-31
mon 月 1-12
dow 星期 1-6 0表示星期天
command 就是要执行的命令
********************************************
ubuntu 使用sh 无法执行脚本文件的解决方法
最近刚开始学习linux shell语言
看的是鸟哥的私房菜,里面有讲到执行shell脚本有两种方法:
1. 设置执行属性: chmod 755 file
执行(如果已经在当前目录) : ./file
2. 使用: sh file 执行
.但是在vmware里装的ubuntu 11.10却无法执行
#!/bin/bash
declare -i s
for (( i = ; i <= ;i = i+ ))
do
s=s+i
done
echo "The count is ==> $s"
使用第二种方法执行时出现 :
test04_for.sh: 1: declare: not found
test04_for.sh: 3: Syntax error: Bad for loop variable
百度了下网上,解决方法:
在终端中输入:
sudo dpkg-reconfigure dash
然后出现的界面中选择 NO
然后就能正确运行了。
**********************************************