很多时候我们会遇见这种情景,大家辛费力苦写了一个本子,经过测试,一切正常,然后放到了crontab里面实践,结果,不管怎么配置,就是执行不健康。

1、在所需用户下(crontab -e 创制定时职责

粗略的弹窗效果

crontab即使不留神的话早晚会出难题,而且那种难题假若出三遍,就会永远记得,因为那种难题很折腾人。
                                                                                                         
——某前辈

结果发现环境难题,居然是其一那么些的罪魁祸首。

2、举办编辑定时义务内容,内容如下

首先是上网查了ubuntu中的弹窗命令,发现notify-send本条命令就能满意须求了

设置了一个crontab
30 0 * * * cd
/home/work/user/huangbx/research/getfeature/data/current; sh resample.sh
&>/dev/null
$sh resample.sh是足以运作的
$head -5 resample.sh
##对真情数据开展采样
set -x
g_date=`date -d “3 days ago ” +%Y%m%d`
可是放到crontab里面就无法运行了。
从网上精通到一般crontab无法运行的题材都是由环境变量在crontab中不自然可甄别引起的。可是resample.sh中并从未涉及环境变量的运用。
经过多番尝试,终于意识是代码的率先行的国语注释引起的标题,添加上#!/bin/sh后就足以运作了。
小结了一下:
crontab中务必非凡注意环境变量的应用
#!/bin/sh并不是必须,只是当没有sha-bang的时候,也绝不在首先行有”#ubuntu中贯彻定时弹窗的提醒脚本,Crontab难点统计。”后带的汉语注释!!
然而当然是丰盛sha-bang啦 #!/bin/sh
2008-11-3补充:
事先并未特别注意环境变量引起的crontab战败,明日果然就赶上了。
题材讲述:cron了某sh文件,里面实践八个操作,既调用了外部的shell脚本,也调用了表面的python脚本。从运行日志看,发现有些脚本被调用,而有些python脚本没有被调用。没有被调用的均是python脚本,而且均采用了MySQLdb模块(第三方模块)。
该脚本在平时径直利用sh命令均可以健康实施。
阴差阳错信息:
Traceback (most recent call last):
File “areafile.py”, line 2, in <module>
    import MySQLdb
File “build/bdist.linux-x86_64/egg/MySQLdb/__init__.py”, line 19,
in <module>
File “build/bdist.linux-x86_64/egg/_mysql.py”, line 7, in
<module>
File “build/bdist.linux-x86_64/egg/_mysql.py”, line 6, in
__bootstrap__
ImportError: libmysqlclient.so.15: cannot open shared object file: No
such file or directory
MySQLdb要求调用mysql那么些库,可是系统并不知道你的mysql安装在哪个地方 : (
题材解决:
在总控的shell脚本中添加一句话
export LD_LIBRARY_PATH=/home/work/local/mysql5/lib/mysql
(也就是根源~/.bash_profile中的LD_LIBRARY_PATH字段)后先后终于得以在crontab中正常启动。
解释:
1) ~/.bash_profile && ~/.bashrc
用户登陆Linux操作系统的时候,”/etc/profile”,
“~/.bash_profile”等计划文件会被自动执行。执行进度是这么的:登陆Linux系统时,首先启动”/etc/profile”,然后启动用户目录下的”~/.bash_profile”,如果”~/.bash_login”和”~/.profile”文件存在的时候也会在实施”~/.bash_profile”后被逐个调用。
上面看看”~/.bash_profile”文件之中有如何东西
$cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/home/work/local/python/lib/python2.5/site-packages/django/bin/:$HOME/bin:/home/work/local/mysql5/bin/;
LD_LIBRARY_PATH=/home/work/local/mysql5/lib/mysql
alias py=’/home/work/local/python/bin/python’
export PATH LD_LIBRARY_PATH
unset USERNAME
可以看出~/.bash_profile文件先调用~/.bashrc,然后再把PATH和LD_LIBRARY_PATH加载。
.bash_profile和.bashrc的差别
/etc/profile:此文件为系统的每个用户设置环境音讯,当用户率先次登录时,该公文被执行.
并从/etc/profile.d目录的装置文件中募集shell的设置.
/etc/bashrc:为每一个周转bash shell的用户执行此文件.当bash
shell被打开时,该文件被读取.
~/.bash_profile:每个用户都可使用该公文输入专用于自己使用的shell音讯,当用户登录时,该
文件仅仅执行两遍!默许情况下,他设置有些环境变量,执行用户的.bashrc文件.
~/.bashrc:该文件包蕴专用于您的bash
shell的bash新闻,当登录时及每回打开新的shell时,该
该文件被读取.
~/.bash_logout:当每一回退出系统(退出bash shell)时,执行该文件.
/etc/profile是全局性的效率,其中设置的变量作用于拥有用户,~/.bash_profile中设置的变量能继承/etc/profile中的变量并功能于用户。
~/.bash_profile 是交互式、login 形式进入 bash 运行的
~/.bashrc 是交互式 non-login 格局进入 bash 运行的
平时二者设置大约相同,所以一般前者会调用后者。(
)
可是在运转crontab的时候,是non_login格局调用程序的,此时~/.bash_profile并不会被提前调用。所以,crontab的运转环境相对于login方式进入bash运行的条件来说小得多。假如程序涉及~/.bash_profile使用的环境变量,那么,部分在login格局得以健康运作的主次在crontab下就无法运转。
在自我的顺序中,系统不能甄别MySQLdb,于是解决方案就是在总控的shell脚本中加上那样一句:
export LD_LIBRARY_PATH=/home/work/local/mysql5/lib/mysql
一发推荐的化解方案:
在cron中加入
LD_LIBRARY_PATH=/home/work/local/mysql5/lib/mysql
如此那般cron中装有应用mysql的东东都得以顺遂运行了 : )
而且这么可以使得操作更加明显。
极端推荐解决方案:
30 12 * * * source ~/.bashrc && cd /home/work/mydir && ./myproj
2) LD_LIBRARY_PATH
Linux运行时有一套共享库(*.so)。共享库的检索和加载是透过/lib/ld.so
(Run提姆e Shared Library Loader)完毕的。ld.so在正规路径(/lib,
/usr/lib)下搜寻共享库。可是假若第三方库并非安装在正式路径下,程序运行的时候就会冒出不能找到库的荒唐,类似于上边那么些报错
ld.so.1: curl: fatal: libgcc_s.so.1: open failed: No such file or
directory
经过设置条件变量LD_LIBRARY_PATH可以让ld.so寻找非标准路径的共享库。LD_LIBRARY_PATH中得以设置两个途径,路径之间通过冒号”:”分割。LD_LIBRARY_PATH中的路径先于标准路径的物色。
在~/.bash_profile中添加如下代码(比如把mysql的so文件添加进LD_LIBRARY_PATH)
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/work/local/mysql5/lib/mysql
export LD_LIBRARY_PATH
由于~/.bash_profile在用户登陆时会加载(而且仅加载)两遍,然后ld.so就会在业内路径和LD_LIBRARY_PATH中活动检索和加载共享库。
LD_LIBRARY_PATH的缺点:(参考
“For security reasons, LD_LIBRARY_PATH is ignored at runtime for
executables that have their setuid or setgid bit set. This severely
limits the usefulness of LD_LIBRARY_PATH.” … ….
…..”LD_LIBRARY_PATH is one of those insidious things that once it
gets set globally for a user, things tend to happen which cause people
to rely on it being set. Eventually when LD_LIBRARY_PATH needs to be
changed or removed, mass breakage will occur!” … … ……”Nowadays
you specify the run-time path for an executable at link stage with the
-R (or sometimes -rpath) flag to ld. There’s also LD_RUN_PATH which is
an environment variable which acts to ld just like specifying -R. Before
all this you had only -L, which applied not only during compile-time,
but during run time as well. There was no way to say “use this directory
during compile time” but “use this other directory at run time”. There
were some rather spectacular failure modes that one could get in to
because of this. “
文中同时提交了如何合理使用LD_LIBRARY_PATH:(纵然尚未完全看懂,如故贴一下,期待尽快的未来能看懂)
      1) Never ever set LD_LIBRARY_PATH globally.
            If you must ship binaries that use shared libraries and want
to allow your clients to install the program outside a ‘standard’
location, do one of the following:
            Ship your binaries as .o files, and as part of the install
process relink them with the correct installation library path.
             Ship executables with a very long “dummy” run-time library
path, and as part of the install process use a binary editor to
substitute the correct install library path in the executable.
        2) If you are forced to set LD_LIBRARY_PATH, do so only as
part of a wrapper.
       3). Remove the link-time aspect of LD_LIBRARY_PATH…..It would
be much cleaner if LD_LIBRARY_PATH only had influence at run-time. If
necessary, invent some other environment variable for the job
(LD_LINK_PATH).
3) ld.so.conf
除此之外设置LD_LIBRARY_PATH外,还足以设置/etc/ld.so.conf。然后运行ldconfig生成ld.so.cache。ld.so查找公共库的时候也会从ld.so.cache中搜索。
不过
“Some OS’s (e.g. Linux) have a configurable loader. You can configure
what run-time paths to look in by modifying /etc/ld.so.conf. This is
almost as bad a LD_LIBRARY_PATH! Install scripts should never modify
this file! This file should contain only the standard library locations
as shipped with the OS. “
LD_LIBRARY_PATH的runtime
Linker详细行为足以参考

俺们先在我们的服务器上执行env命令,出现如下:

澳门金沙国际 1

notify-send ["该休息一下啦"] "喝水!伸懒腰!动一动!"

转自:

 1 XDG_VTNR=1
 2 XDG_SESSION_ID=1
 3 HOSTNAME=bogon
 4 IMSETTINGS_INTEGRATE_DESKTOP=yes
 5 GPG_AGENT_INFO=/run/user/0/keyring/gpg:0:1
 6 VTE_VERSION=3802
 7 TERM=xterm
 8 SHELL=/bin/bash
 9 XDG_MENU_PREFIX=gnome-
10 HISTSIZE=1000
11 GJS_DEBUG_OUTPUT=stderr
12 WINDOWID=37748743
13 GJS_DEBUG_TOPICS=JS ERROR;JS LOG
14 IMSETTINGS_MODULE=IBus
15 QT_GRAPHICSSYSTEM_CHECKED=1
16 USER=root
17 SSH_AUTH_SOCK=/run/user/0/keyring/ssh
18 USERNAME=root
19 SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1672,unix/unix:/tmp/.ICE-unix/1672
20 PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
21 MAIL=/var/spool/mail/root
22 DESKTOP_SESSION=gnome
23 QT_IM_MODULE=ibus
24 PWD=/root
25 XMODIFIERS=@im=ibus
26 LANG=zh_CN.UTF-8
27 GDM_LANG=zh_CN.UTF-8
28 KDEDIRS=/usr
29 GDMSESSION=gnome
30 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
31 HISTCONTROL=ignoredups
32 HOME=/root
33 XDG_SEAT=seat0
34 SHLVL=2
35 GNOME_DESKTOP_SESSION_ID=this-is-deprecated
36 XDG_SESSION_DESKTOP=gnome
37 LOGNAME=root
38 DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-VQpgyslPbO,guid=0b7c6ec0e15a92dd89a8eaf654f84153
39 LESSOPEN=||/usr/bin/lesspipe.sh %s
40 WINDOWPATH=1
41 XDG_RUNTIME_DIR=/run/user/0
42 DISPLAY=:0
43 XDG_CURRENT_DESKTOP=GNOME
44 XAUTHORITY=/run/gdm/auth-for-root-A4DlSi/database
45 _=/usr/bin/env

将日志追加到 log中

弹窗效果

 

 

0 * * * *  /home/tomcat/restar_jslave.sh >> con_jenkins_crontab.log 2>&1 &

澳门金沙国际 2

大家都知情crontab是个好东东,可以定时执行一些职分,扶助你监督种类情状,协助您每日重复的做一些机械的业务。然而crontab有一个坏毛病,就是它总是不会缺省的从用户profile文件中读取环境变量参数,日常导致在手工执行某个脚本时是打响的,可是到crontab中准备让它为期执行时就是会出错
原先我用一个很傻的办法,就是在剧本中直接指定所有的环境变量参数,每一回写脚本都要写好多好多PATH啦,LD_LIBRARY_PATH之类的环境变量参数
新兴发现实际可以一贯在本子里先实施一下用户的profile文件,就OK了
倘假诺Linux环境下的脚本,脚本的头上用缺省的#!/bin/sh就足以了,倘使是Solaris环境下的脚本,脚本头上用#!/bin/ksh
然后第二个部分先写那几个:
###################
. /etc/profile
. ~/.bash_profile
##################
诸如此类,crontab在实践脚本的时候,就可见读到用户的环境变量参数啦。。。一点儿小技巧而已
^_^
附:
只要您是在cron里提交的,请留意:
绝不假定c r o n知道所急需的独特条件,它实在并不知道。所以你要保管在s h e
l l脚本中提供所有须求的路径和环境变量,除了部分机关安装的全局变量。
如果c r o n不能够运作相应的台本,用户将会收下一个邮件表明其中的原由。

接下来大家编辑一个crontab,如下:

3、保存定时任务

弹窗效果有了,然后应该是一个定时弹窗的功能

* * * * * env > /home/crontab.out

4、crontab -l 查看已部分定时义务

一、cron命令已毕定时弹窗

 

5、将定时职分 chmod 755 权限

想到的是cron指令,google了广大课程,都不曾成功

接下来大家在/home/crontab.out文件中,看看里面的始末。令人奇怪的是,我们发现的其中的信息唯有

欣逢的题材:

在/etc/crontab 中参与了

 1 XDG_SESSION_ID=3
 2 SHELL=/bin/sh
 3 USER=root
 4 PATH=/usr/bin:/bin
 5 PWD=/root
 6 LANG=zh_CN.UTF-8
 7 SHLVL=1
 8 HOME=/root
 9 LOGNAME=root
10 XDG_RUNTIME_DIR=/run/user/0
11 _=/usr/bin/env

在进行定时职务时,提醒java commond not find

* * * * * root notify-send ["该休息一下啦"] "喝水!伸懒腰!动一动!"

 

解决方法:在conn_jenkins脚本中,添加java的相对路径(xx/xx/bin)

也用命令编辑了

大家先不钻探原因,那里,大家就足以见到为啥许多脚本在crontab中编辑后不可以运行了。因为crontab的天职环境就不曾概念那么多的环境变量,大家在交互式的环境下写的剧本中用到了那些没有的环境变量,当然可以透过,可是放到crontab下就不行了。

现实路径,env查看

crontab -e

 

要么 定时义务的shell脚本中追加 source /etc/profile 若 无效

而且也启动了cron服务

那么那几个环境变量居然差那么多,为啥吗?因为系统的cron
deamon会自动安装可结合最小环境的环境变量。

0 * * *澳门金沙国际, * ./etc/profile; /home/tomcat/restar_jslave.sh >> con_jenkins_crontab.log 2>&1 &

server cron start

 

在定时职务前加环境变量是因为

仍然尚未马到成功

缓解方案可以有三种:

crontab命令自己是不带环境变量的,shell脚本是它实施一个文本,在其中写上只是在shell脚本里带上了环境变量,

算是在一个介绍crontab用法的博客终于找到自己的crontab脚本不履行的来头了:从没设置环境变量!

  1. 概念好一些环境参数,并在crontab里面先source生效,再执行主程序脚本

  2. 一直把脚本中的环境变量改为相对路径。

用crontab执行后的长河是由crontab发起的,所有得在crontab里丰盛环境变量才起效果

在crontab文件中定义三个调度职责时,必要专门注环境变量的设置,因为我们手动执行某个职分时,是在此时此刻shell环境下展开的,程序当然能找到环境变量,而系统自动执行职分调度时,是不会加载任何环境变量的,因而,就须要在crontab文件中指定职分运行所需的装有环境变量

crontab脚本

HOME=/
SHELL=/bin/bash
0 * * * * notify-send ["该休息一下啦"] "喝水!伸懒腰!动一动!"

这么就兑现了

二、shell脚本无限循环已毕

上边是本子:

while :
do 
 sleep 3600
 echo time past
 notify-send ["该休息一下啦"] "喝水!伸懒腰!动一动!"
done

把那么些剧本加入到home目录的.bashrc中,每便登陆就能启动了

三、利用zenity和notify-send实现

#!/bin/bash
alartTime=100
while (($alartTime))
do
if (($alartTime != 100)) # 如果不是 100,则说明不是初次运行,则弹出下面的提示
then
notify-send $alartTime"分钟已到,请重新设定!"
zenity --info --text "时间到,请重新设定!"
fi
alartTime=$(zenity --entry --title "定时提醒" --text "输入提醒时间(分钟, 将忽略小数)")
alartTime=${alartTime%.*} # 忽略输入的小数点后面的数字,如 4.6 识别为 4
if (($alartTime > 60)) # 不能超过最大值
then
zenity --info --text "必须小于60分钟,退出"
break
fi
notify-send "成功设定"$alartTime"分钟,开始计时"
sleep $((alartTime*60))
done

上边的脚本,使用了 notify-send 命令用于在桌面上弹出气泡提醒,使用了
zenity 命令用于体现图形窗口。
祥和用的话,上边的脚本可以写得更简约一点,因为漏洞百出检测没要求做。可是一旦要给不太懂的人用的话,我那脚本里的错误检测及处理则会就显得有点无法了。

总结

好了,终于不负众望了ubuntu中弹窗提醒脚本了,本文提供二种方法供大家参考借鉴,不晓得大家都学会了从未,希望那篇作品的内容对大家能拥有接济,假如有疑点大家可以留言交换。

你或许感兴趣的篇章:

  • mysql自动化安装脚本(ubuntu and
    centos64)
  • ubuntu系统中nginx启动脚本
  • Shell脚本达成自动检测修改最快的Ubuntu软件源
  • Ubuntu、Linux
    Mint一键安装Chrome浏览器的Shell脚本分享
  • 用Shell脚本快速搭建Ubuntu下的Nodejs开发环境
  • 获取服务器消息的Shell脚本分享(ubuntu、centos测试通过)
  • Ubuntu下定时交由代码到SVN服务器的Shell脚本分享
  • Ubuntu
    Server下MySql数据库备份脚本代码
  • Ubuntu服务器配置apache2.4的限速效率shell脚本分享
  • Ubuntu
    14.04装置开机启动脚本的形式

相关文章