2020-01-09 16:50:54 gaojing2240 阅读数 22

        首先,介绍一下遇到的问题:

        同事设置定时任务执行脚本,却显示无法执行,但是可以直接执行脚本,同事怀疑是定时任务没有成功设置到该用户上。导致无法识别命令,大概内容如下:此处为了简略,大概写一个定时

[hadoop@hadoop-31-150 ~]$  crontab -e
no crontab for hadoop - using an empty one
crontab: installing new crontab
[hadoop@hadoop-31-150 ~]$  crontab -l
* * * * * /home/hadoop/test.sh > /home/hadoop/test.log

     因为同事怀疑没有设定了用户,所以用root用户查看了目录/var/spool/cron

[root@hadoop-31-150 ~]# ll /var/spool/cron
total 4
-rw-------. 1 hadoop hadoop 55 Jan  9 15:09 hadoop
[root@hadoop-31-150 ~]# cat /var/spool/cron/hadoop 
* * * * * /home/hadoop/test.sh > /home/hadoop/test.log

    确实成功为该用户配置了定时任务,回头再来看看报错信息吧:

[hadoop@hadoop-31-150 ~]$ cat /var/spool/mail/hadoop
From hadoop@hadoop-31-150  Thu Jan  9 15:16:02 2020
Return-Path: <hadoop@hadoop-31-150>
X-Original-To: hadoop
Delivered-To: hadoop@hadoop-31-150
Received: by hadoop-31-150 (Postfix, from userid 1005)
	id 77A88108912B; Thu,  9 Jan 2020 15:16:01 +0800 (CST)
From: "(Cron Daemon)" <hadoop@hadoop-31-150>
To: hadoop@hadoop-31-150
Subject: Cron <hadoop@hadoop-31-150> /home/hadoop/test.sh > /home/hadoop/test.log
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
Precedence: bulk
X-Cron-Env: <XDG_SESSION_ID=4663>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/1005>
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/hadoop>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=hadoop>
X-Cron-Env: <USER=hadoop>
Message-Id: <20200109071601.77A88108912B@hadoop-31-150>
Date: Thu,  9 Jan 2020 15:16:01 +0800 (CST)

/home/hadoop/test.sh: line 3: java: command not found

   这里先来看下test.sh 脚本内容:

[hadoop@hadoop-31-150 ~]$ cat test.sh 
#!/bin/sh

java -version
[hadoop@hadoop-31-150 ~]$ 

   很简单的一个执行java ,报错显示找不到java 命令,但是确实给hadoop配置了java 在shell窗口和执行脚本都可以执行

[hadoop@hadoop-31-150 ~]$ java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
[hadoop@hadoop-31-150 ~]$ ./test.sh 
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

   因为这个原因同事怀疑是用户问题,但是再一次看报错邮件时,发现了端倪。定时任务打印出了执行脚本时的环境变量

X-Cron-Env: <PATH=/usr/bin:/bin>

   确实没有java的路径,想起了之前学到的bash的四种执行命令:1.交互式登录执行 ,2.非交互式登录执行 3.交互式非登录执行 4.非交互式非登录执行 这四种不同的执行命令方式会加载不同的配置文件。可以通过命令

[hadoop@hadoop-31-150 ~]$ man bash

INVOCATION 部分内容如下:

大概就是讲bash执行命令时候加载文件顺序如下图

所以,此种情况下,定时任务执行的命令应该是非交互式非登录的执行命令,不加载任何配置文件,但会获取$BASH_ENV

所以改一下定时任务为

[hadoop@hadoop-31-150 ~]$ crontab -l
* * * * *  export BASH_ENV=/opt/conf/java_env.sh;/home/hadoop/test.sh > /home/hadoop/test.log

发现仍然无法执行,再次查看man bash  INVOCATION 中有一句话

A non-interactive shell invoked with the name sh does not attempt to read any other startup files.

使用sh 调用非交互shell时,不会加载任何启动文件。虽然sh是bash的软连接,但是当sh启动时,bash仍会尽可能的接近sh启动。所以将 test.sh的启动头改为#!/bin/bash

[hadoop@hadoop-31-150 ~]$ cat test.sh 
#!/bin/bash

java -version

再次等待定时任务,果然,执行成功。但是此种方法还需要另行设置BASH_ENV,有没有更简便的方法呢?当然有,那就是编辑test.sh启动头为#!/bin/bash --login ,通过mam bash INVOCATION 部分可以看到,当指定--login时,会加载配置文件/etc/profile,和~/.bash_profile或者 ~/.bash_login或者 ~/.profile。这样以登录式的执行文件,便与登录到服务器shell执行命令时的环境参数一样了。所以相比上面那种方法,这种更为简单。

---------------------------------------------------------------------------------------------

顺便大概记录下之前遇到的相关问题。

背景:需要java程序中调用hadoop-daemon.sh脚本启动服务,后发现无法调用成功,还是环境变量的事情。

问题解决:发现是因为该java程序是由脚本启动,在脚本中定义了环境变量,与外部配置环境变量冲突,当此java程序调用hadoop-daemon.sh时,hadoop-daemon.sh脚本会继承java启动脚本中的环境变量,故无法成功启动。更改java启动脚本中环境变量后解决!

 

 

2019-02-20 11:59:25 w18211679321 阅读数 2826

关于运行

Python脚本直接运行不需要部署Apache、Nginx等服务器,在拥有Python环境的前提下,直接使用python 文件路径+文件名.py即可运行脚本。
注意:代码最上方要标明路径 如:#!/user/python


关于参数

Python中sys.argv可以获取由命令行输入的参数,sys.argv[0]为存放参数位置,sys.argv[1]开始为参数具体数值,即:

# 命令行
python 文件路径+文件名.py [参数1] [参数2] ... [参数n]

# 脚本内容
import sys
变量1 = sys.argv[1]
变量2 = sys.argv[2]
...
变量n = sys.argv[n]

关于编码

Linux中python默认编码文件为ASCII码,如果使用包括中文在内的特殊字符,系统会提示SyntaxError错误。

如果需要改变编码格式,只需要在代码最上方添加# coding=UTF-8# -*- coding:UTF-8 -*-即可。

2017-12-26 11:08:32 sukangshen 阅读数 26383

Linux上面执行定时任务,我们可以利用crontab -e直接编辑定时任务 另外我们还可以写好shell脚本,定时去执行shell脚本,这两个方法都可以起到定时执行的作用

下面我详细说一下入如何执行shell脚本

1.声明一下我安装的lnmp环境,shell脚本存放的位置在 /usr/local/sbin路径下面

新建一个test.sh

#! /bin/bash  
echo "yes" >> /home/abc.txt
保存完毕后记得给予权限 chmod 777 test.sh

Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大家的一个习惯而已。所以,以后您发现了.sh为后缀的文件那么它可能是一个shell脚本了。test.sh中第一行要以 “#! /bin/bash” 开头,它代表的意思是,该文件使用的是bash语法。如果不设置该行,虽然您的shell脚本也可以执行,但是这不符合规范。 # 表示注释,在前面讲过的。后面跟一些该脚本的相关注释内容以及作者和创建日期或者版本等等。当然这些注释并非必须的,如果您懒的很,可以省略掉,但是不建议省略。因为随着工作时间的逐渐过渡,您写的shell脚本也会越来越多,如果有一天您回头查看自己写过的某个脚本时,很有可能忘记该脚本是用来干什么的以及什么时候写的。所以写上注释是有必要的。另外系统管理员并非只有您一个,如果是其他管理员查看您的脚本,他看不懂岂不是很郁闷。下面该运行一下这个脚本了:

2.将shell脚本加入定时任务

crontab -e

* * * * * /usr/local/sbin/test.sh

参  数:
-e  编辑该用户的计时器设置。
-l  列出该用户的计时器设置。
-r  删除该用户的计时器设置。
-u<用户名称>  指定要设定计时器的用户名称。

crontab 格式:

分钟   小时   日   月   星期   命令

*        *      *    *     *       *

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列 表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

记住几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

3.查看执行test.sh脚本的结果

[root@iz2ze2ewt14msyueuiq693z home]# cat abc.txt 
yes
yes
yes
yes
执行成功  666


2018-06-12 17:04:56 songjiaping 阅读数 909

需要对本地的某些程序做自动备份,定时为每天7点进行备份,使用crontab命令实现。

1、crontab -e

直接输入命令crontab -e会直接打开一个编辑器窗口,一般为vi,直接在编辑器中写入:

# m h  dom mon dow   comman
0 7 * * * /root/user/backup.sh

编辑保存命令与vi的一致。

保存后有些人说需要重启cron,但是我好像不需要重启:service cron restart

前面五个值分别为分、时、日、月、周,百度可以搜到很多用法,基本用法有:

m:0-59,*表示每分钟执行一次,*/5表示每隔5分钟执行一次;

h:0-23,*表示每小时执行一次;

d:1-31,*表示每天执行一次:

m:1-12,*表示每个月执行一次;

w:0-6,0为星期天,*表示每星期执行一次;

每分钟执行一次只需要五个*,输入* * * * * command

上述的意思就是每天的7点钟开始执行,执行时间可能会有一点偏差,但是不会偏差很大。

参考:https://www.jb51.net/LINUXjishu/19905.html

查看目前拥有的定时任务:crontab -l

删除所有的定时任务:crontab -r

只需要删除一个任务需要使用crontab -e进行编辑。

2、vi /etc/crontab

还有一种方式是直接编辑crontab,总感觉这个方法会比较靠谱,使用方法与crontab -e差不多,但是多了一个user的字段:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

与上一个命令一样,在其他系统定时任务后面新加一条命令即可:

0  7   * * *   root   /root/user/backup.sh

保存退出。

参考:http://www.cnblogs.com/xd502djj/p/4292781.html

ps:可以先使用* * * * *来确认定时是否可用,在定时任务的脚本中,需要先cd到一个确定的目录,之前尝试的时候一直看不到效果,原因是他不会将脚本所在的位置当做当前path,默认path是/root

我测试时的脚本,可参考:

crontab -e:

* * * * * /root/user/test.sh

vi /etc/crontab:

*  *    * * *   root    /root/user/test.sh

test.sh:

cd /root/user
DATE=$(date +"%y-%m-%d_%H:%M:%S")
mkdir $DATE

2019-08-14 16:01:25 Q_AN1314 阅读数 64
  • 直接执行:使用绝对/相对路径,或者bash + script.sh的方式运行脚本,脚本会使用一个新的bash环境来运行,即该脚本在原bash的子进程中运行,因此脚本中定义的变量不会在原bash中出现
  • 使用source/.的方式执行:使用source命令或者小数点来运行脚本,该脚本会在原有bash中执行
没有更多推荐了,返回首页