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

然后就能正确运行了。

**********************************************

Crontab中的除号(slash)到底怎么用?

crontab 是Linux中配置定时任务的工具,在各种配置中,我们经常会看到除号(Slash)的使用,那么这个除号到底标示什么意思,使用中有哪些需要注意的地方呢?
 
在定时任务中,我们经常有这样的需求,比如每5分钟查看一下日志,我们可以这么写:
 
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /command
 
这样肯定是没有问题的,但是就写书写起来非常复杂,简化一下可以这么写:
 
0-55/5 * * * * /command
 
这样的写法已经简化了很多,大家还是觉得麻烦,那么可以这样写:
 
*/5 * * * * /command
 
怎么样,是不是非常简单明了。这句就表示在0,5,10,15,20,25,30,35,40,45,50,55分钟的时候执行命令,即每隔5分钟执行命令。
 
由此我们得出除号与范围搭配使用,表示命令执行的步长。
 
那么我下面这种写法,是否标示每13分钟执行一次命令呢?
 
*/13 * * * * /command
 
这里就是需要注意的地方。有一些步长是无法用这种方式表达的。只有能够被整除的步长值才能表达与我们理解相一致确切的含义,对于分钟来说只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,对于小时来说则只有*/2,*/3,*/4,*/6,*/8,*/12。对于日期来说,如果使用*/5,则不能保证每5天执行一次,到月底的时候可能只执行1天、2天或3天后就停止了,这取决与大小月与平闰年。这是因为 cron 是没有状态的,它不能够记录上次执行的是什么时间,只能根据当前的时间来判断是否需要执行。
 
而对于*/13这个例子来说,表示在分钟这个范围内,即0-59分钟,任务会每13分钟执行一次。即:0,13,26,39,52,之后再间隔8分钟,就会又重新执行。
 
再看下面一个例子:
 
0 6 */2 * * /command 
 
看到这个我们如果理解成每xx执行就是,每两天的6点钟执行命令。在这里*的范围是1-31,*/2表示任务在奇数天执行,那么在1、3、5、7、8、10、12月,月末最后一天执行后,紧接着第二天仍然后执行,那这就不是每2天执行一次。

ubuntu 下执行定时任务的更多相关文章

  1. yii2在ubuntu下执行定时任务

    一.编辑yii console/controllers TestController.php 二./usr/ 包括与系统用户直接有关的文件和目录创建sh_scripts目录,/usr/sh_scrip ...

  2. Ubuntu下执行mysql的sql文件

    Ubuntu下执行mysql的.sql文件   方法一: 1.执行此命令,会提示输入mysql的root账户的密码,验证成功后,会在dbname这个数据库中执行filename.sql这个脚本,其中f ...

  3. ubuntu下执行ulimit返回“不允许的操作”,问题解决思路

    在ubuntu下执行ulimit,希望修改允许的最大打开文件数,但返回“不允许的操作”. 使用ulimit -a查看当前配置 core file size (blocks, -c) 0 data se ...

  4. laravel中ubuntu下执行php artisan migrate总是报错

    ubuntu14.0 + xampp + laravel5下 laravel中ubuntu下执行php artisan migrate总是报错: [PDOException] could not fi ...

  5. ubuntu中执行定时任务crontab

    今天研究了下ubuntu里的crontab内置指令.这是设置定时执行脚本任务的指令,我先测试了下最基础的执行. 第一次使用crontab 时,会出现 no crontab for root - usi ...

  6. Ubuntu下添加定时任务执行php文件

    //添加自动下载定时任务1. vim /etc/crontab2. 添加 #每5分钟执行一次*/5 * * * * root /usr/bin/php /home/wwwroot/123.php3. ...

  7. 【Ubuntu】执行定时任务(cron)

    1.打开定时任务配置文件 crontab -e 2.编写定时任务时间 命令和脚本例如: /3 * * * * /soft/config/test.sh 前5个字段为时间,后面的一个为命令 前5个含义为 ...

  8. ubuntu下创建定时任务的两种方式及常见问题解决方案

    创建定时任务的目的就是摆脱人为对程序重复性地运行. 0. 首先用下面的指令检查你是否安装crontab, crontab -l 如果本身就有的话,那么出现如下指令 LC_CTYPE="zh_ ...

  9. Windows Server 2016 下执行定时任务(英文系统)

    Step1. 找到“控制面板(Control Panel)” 打开 “管理工具(Administrative Tools)” Step2. 打开“任务计划(Task Schedule)” Step3. ...

随机推荐

  1. 关于使用Delphi XE10 进行android开发的一些总结

    RAD,可以快速开发出来,但是问题较多最好别用 说实话    做出来的app 太!大!了!  十分的特别的占内存!       FireMonkey 真心太大了...  太占内存了  开发一般应用还可 ...

  2. div里粘贴文字后,移动光标至最后

    cursormanager.js //Namespace management idea from http://enterprisejquery.com/2010/10/how-good-c-hab ...

  3. LeetCode 11 Container With Most Water(分支​判断问题)

    题目链接 https://leetcode.com/problems/container-with-most-water/?tab=Description   Problem: 已知n条垂直于x轴的线 ...

  4. sencha touch datepicker/datepickerfield(时间选择控件)扩展(废弃 仅参考)

    参考资料:https://market.sencha.com/extensions/datetimepicker 上面的扩展在2.2有些问题,参考源码重新写了一个 TimePicker: Ext.de ...

  5. Artech的MVC4框架学习——第三章controller的激活

    第一当目标controller的名称通过URL路由被解析出来后,asp.net mvc利用 ControllerBuilder 注册 ControllerFactory ,根据名称实现对目标contr ...

  6. FPM打包工具使用

    author:headsen chen date: 2019-01-19  14:57:09 个人原创博客,转自请注明出处和作者,否则追究法律责任 1,安装依赖和语言包 yum -y install ...

  7. python pytest测试框架介绍二

    在介绍一中简单介绍了pytest的安装和简单使用,接下来我们就要实际了解pytest了 一.pytest的用例发现规则 pytest可以在不同的函数.包中发现用例,发现的规则如下 文件名以test_开 ...

  8. “找女神要QQ号码”——java篇

    题目就是这样的: 给了一串数字(不是QQ号码),根据下面规则可以找出QQ号码: 首先删除第一个数,紧接着将第二个数放到这串数字的末尾,再将第三个数删除,并将第四个数放到这串数字的末尾...... 如此 ...

  9. hiredis安装及测试

      (1) redis环境搭建    (2) hiredis下载地址及C API  github   (3) hiredis安装 我是把libhiredis.so放到/usr/local/lib/中, ...

  10. R的any和all

    > x<-1:10 > any(x>8) [1] TRUE > all(x>8) [1] FALSE