说白了,就是一些例行工作的日常执行的排序程序
Linux 工作排程的种类: at,cron
鸟叔说,atd并不是在所有版本都是开启的,但是centos7默认是开启的
[root@localhost ~]# systemctl restart atd #重启atd服务 [root@localhost ~]# systemctl enable atd #开机自运行 [root@localhost ~]# systemctl atd status Unknown operation 'atd'. [root@localhost ~]# systemctl status atd #查阅一下atd目前的状态 ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) #是否开机启动 Active: active (running) since 一 2019-08-26 09:40:41 CST; 26s ago #active(running)是否正在运行中 Main PID: 49782 (atd) CGroup: /system.slice/atd.service └─49782 /usr/sbin/atd -f 8月 26 09:40:41 localhost.localdomain systemd[1]: Started Job spooling tools.
利用at进行工作排程,工作排程就类似于任务。就需要将任务放到一个文本文件中,这个文本文件放在/var/spool/at目录中。这样就可以利用at来执行了
这就类似于自启动进程。在写黑客程序的时候,都会有一个默认自启动的服务,Linux这里就是类似于这么个东东,这就需要限制账户来执行Linux的at排程,以免黑客程序的入侵
利用/etc/at.allow与/etc/at.deny这两个文件来限制at的执行。执行原理如图
at语法
at指令的下达,会进入一个at shell的环境来操作。指令的下达就与环境变量有关,同时与当时的工作目录也有关联,因此使用绝对路径会比较保险一些。
利用at命令,将/root/.bashrc进行邮寄
[root@localhost ~]# at now +5 minutes at> /bin/mail -s "testing at job" root < /root/.bashrc at> <EOT> job 3 at Mon Aug 26 10:36:00 2019 [root@localhost ~]# at -c 3 #!/bin/sh # atrun uid=0 gid=0 # mail root 0 umask 22 XDG_SESSION_ID=1; export XDG_SESSION_ID HOSTNAME=localhost.localdomain; export HOSTNAME SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED SHELL=/bin/bash; export SHELL HISTSIZE=1000; export HISTSIZE SSH_CLIENT=192.168.132.1 64086 22; export SSH_CLIENT PERL5LIB=/root/perl5/lib/perl5:; export PERL5LIB SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE QTDIR=/usr/lib64/qt-3.3; export QTDIR QTINC=/usr/lib64/qt-3.3/include; export QTINC PERL_MB_OPT=--install_base /root/perl5; export PERL_MB_OPT SSH_TTY=/dev/pts/0; export SSH_TTY QT_GRAPHICSSYSTEM_CHECKED=1; export QT_GRAPHICSSYSTEM_CHECKED USER=root; export USER LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:; export LS_COLORS MAIL=/var/spool/mail/root; export MAIL PATH=/usr/lib64/qt-3.3/bin:/root/perl5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin; export PATH PWD=/root; export PWD LANG=zh_CN.UTF-8; export LANG KDEDIRS=/usr; export KDEDIRS SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED HISTCONTROL=ignoredups; export HISTCONTROL SHLVL=1; export SHLVL HOME=/root; export HOME PERL_LOCAL_LIB_ROOT=:/root/perl5; export PERL_LOCAL_LIB_ROOT LOGNAME=root; export LOGNAME QTLIB=/usr/lib64/qt-3.3/lib; export QTLIB XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share; export XDG_DATA_DIRS SSH_CONNECTION=192.168.132.1 64086 192.168.132.16 22; export SSH_CONNECTION LESSOPEN=||/usr/bin/lesspipe.sh %s; export LESSOPEN XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR QT_PLUGIN_PATH=/usr/lib64/kde4/plugins:/usr/lib/kde4/plugins; export QT_PLUGIN_PATH PERL_MM_OPT=INSTALL_BASE=/root/perl5; export PERL_MM_OPT OLDPWD=/srv; export OLDPWD cd /root || { echo 'Execution directory inaccessible' >&2 exit 1 } ${SHELL:-/bin/sh} << 'marcinDELIMITER056cdc8c' /bin/mail -s "testing at job" root < /root/.bashrc #这里就是我们的指令 marcinDELIMITER056cdc8c
batch:系统有空时才进行的后台任务
batch指令,会在cpu工作负载小于 0.8 的时候,才进行你所下达的任务指令。
鸟哥解释的很清楚,这个工作负载的概念
整分时间 概念
循环执行的例行性工作排程
我理解的就是,每隔多长时间执行一次的程式
上面三个图就是 日期格式 的范围
上面倒数第而张图,那个例子很清晰。。
上面几个日期函数的特殊字符,我觉得很有用。。。
这里有个例外。就是鸟哥在文中说的,cron这个命令,有的unix会把他放到内存里去执行,这样,需要重启一下cron服务,才能执行你的修改后的指令 systemctl restart crond ,将服务重启一下
[root@localhost ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root #发生错误时,发送的地址,默认是发送给root。可以发送到自己的邮箱地址。 # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
将某个sh产生的信息丢入垃圾桶
xxxxx.sh > /dev/null 2>&1
后面的2>&1,不大理解为什么要加这个,所以查了一下
对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null(这里才是重点)
可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。
为何2>&1要写在后面?
index.php task testOne >/dev/null 2>&1
我们可以理解为,左边是标准输出,好,现在标准输出直接输入到 /dev/null 中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。
可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件
将指令至于背景中,我理解的意思就是后台运行
在指令后面加&
[root@localhost ~]# tar -zpcf /tmp/etc.tar.gz /etc &