程序计划任务管理

2022-09-28 19:47:58 浏览数 (1)

[TOC]

0x00 快速入门

描述:Linux工作管理指的是在单个登录终端中(shell界面)同时管理多个工作行为; 在Linux系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobs、bg、和 fg 三个命令以及两个快捷键来完成。

注意事项:

  • 1.当前的登录终端,只能管理当前终端的工作,而不能管理其他登录终端的工作
  • 2.放入后台的命令必须可以持续运行一段时间,这样我们才能捕捉和操作这个工作
  • 3.放入后台执行的命令不能和前台用户有交互或需要前台输入,否则放入后台只能暂停,而不能执行
  • 4.后台进程是终端绑定的,也就是说如果退出终端,这个进程就会消失.

Linux后台运行:命令后面加上“ &”(注意事项如下图),在windows最小化就是放入后台执行 如:vi,top一般把运行持续时间长的命令放入后台执行

代码语言:javascript复制
#示例1.
命令 &   #把进程放入后台
tar -zcf etc.tar.gz /etc &    #把命令放入后台,并在后台执行

#示例2.任何需要与前端交互的进程/命令 放入后台执行都会自动被暂停(没有意义):
top    # 按下crtl z快捷键后,放在后台暂停

描述:程序计划任务是非常重要的不论是在Linux上还是在Windows上都是不可或缺的,它帮助了我们运维人员减少手动操作的工作量;计划任务:scheduled task Linux下的任务调度分为两类:系统任务调度和用户任务调度。

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。
  • 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

0x01 后台执行

bg 命令

描述:用于将作业放到后台执行(backgroud)使前台可以执行其他任务,该命令的运行效果与在指令后面添加&符号;的效果是相同的,都是将其放到系统后台执行.

代码语言:javascript复制
bg (参数) #作业标识:指定需要放到后台的作业标识号。
bg %工作号

实际案例:

代码语言:javascript复制
#示例1.使用bg命令将任务号为1的任务放到后台继续执行,输入如下命令:
#注意:实际上,使用bg命令与在指令后面添加符号"&"的效果是一样的。例如,使用&将find / -name password放到后台执行,输入如下命令:
find / -name password &     #后台执行任务
$bg 1  #后台执行任务号为1的任务如果系统中只有一个挂起的任务时,即使不为该命令设置参数"1",也可以实现这个功能。
-bash: bg: 任务已经终止
[1]   完成                  find / -name password

注意:后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台执行.

jobs 命令

描述:用于显示Linux中的当前任务列表及任务状态包括后台运行的脚本或任务,可以显示任务号及其对应的进程号; 其中任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的,一个任务可以对应于一个或者多个进程号;

代码语言:javascript复制
#基础参数和语法
jobs [选项] [参数]   # 查看在后台运行的程序
jobs [-l]    # 查看进程PID号

-l:显示进程号;
-p:仅任务对应的显示进程号;
-n:显示任务状态的变化;
-r:仅输出运行状态(running)的任务;
-s:仅输出停止状态(stoped)的任务。

#jobs的状态有:
Stopped/Running/Done

_注:_
“+”号代表最近一个放入后台的工作,也是工作恢复时,默认恢复的工作;
“-”号代表倒数第二个放入后台的工作;

实际案例:

代码语言:javascript复制
#示例1. 使用jobs命令显示当前系统的任务列表,输入如下命令:

#注意:要得到以上输出信息,必须在执行jobs命令之前执行命令find / -name password &。否则,执行jobs命令不会显示任何信息。
jobs -l               #显示当前系统的任务列表

#上面的命令执行后,将显示出当前系统下的任务列表信息,具体如下所示:
[1]   1903 运行中          find / -name password &
#其中,输出信息的第一列表示任务编号,第二列表示任务所对应的进程号,第三列表示任务的运行状态,第四列表示启动任务的命令。

fg 命令

描述:用于将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行,与bg命令一样若后台任务中只有一个,则使用该命令时可以省略任务号;如果有多个任务可以fg加任务编号调用fg 1 frontground;

代码语言:javascript复制
fg %工作号   #%工作号的%号可以省略,是工作号不是PID号 ( 作业标识:指定要放到前台的作业标识号 )

基础示例:

代码语言:javascript复制
#示例1.使用fg命令将任务号为1的任务从后台执行转换到前台执行,输入如下命令
fg 1          #将任务转换到前台执行

#执行上面的命令后,命令行窗口将显示如下信息
find / -name password       #前台执行命令

nohop 命令

描述:把命令传入后台,后台进程是终端绑定的,也就是说如果退出终端这个进程就会消失,当logout时在kill -l将发送SIGHUP信号 并且可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端:

  • 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。
  • 如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。
  • 如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。
  • 如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

脱离终端的三种办法:

  • 1.把需要后台执行的命令加入/etc/rc.local
  • 2.使用定时任务,让系统在指定时间执行
  • 3.使用nohup命令

而对于mysqld进程,因为是守护进程所以不受terminal关闭而关闭,例如:deamon守护进程

代码语言:javascript复制
~/usr/local/mysql/bin/mysqld --user=mysql &

#基础语法和参数
nohup (选项) (参数)
nonup [命令] &

实际案例:

代码语言:javascript复制
#示例1.使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &  #输出被重定向到myout.file文件中。
nohup /root/for.sh &

0x02 计划任务

at 命令

描述:用于在指定时间执行命令,允许使用一套相当复杂的指定时间的方法,它主要是在centos6以下才预装;(建议采用crontab方便可重复执行)

  • 在当天的hh:mm(小时:分钟)式的时间指定,假如该时间已过去,那么就放在第二天执行。
  • 使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。
  • 采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。
  • 指定命令执行的具体日期,指定格式为month day(月、日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。

总结时间格式:

代码语言:javascript复制
HH:MM
HH:MM YYYY-MM-DD
HH:MM[am|pm][month][date]
HH:MM[am|pm] [minutes|hours|days|weeks]   #   什么时间之后

at的访问控制:

  • 有/etc/at.allow文件,那么只有写入/etc/at.allow(白名单)中的用户可以使用at命令(/etc/at.deny文件会被忽略).
  • 没有/etc/at.allow文件,只有/etc/at.deny文件,那么写入/etc/at.deny文件(黑名单)中的用户不能使用它命令,
  • 不管有木有对root不起作用,如果系统中这两个文件都不存在,那么只有root用户可以使用at命令.
代码语言:javascript复制
at [选项] 指定任务执行的日期时间
atq             #查询当前服务器上的at工作好
atrm[工作号]#删除指定的at任务

#参数
-c 工作号:显示该at工作的实际内容
-f:指定包含具体指令的任务文件;
-q:指定新任务的队列名称;
-l:显示待执行任务的列表;
-d:删除指定的待执行任务;
-m:任务执行完成后向用户发送E-mail。

# 判断安装与否
chkconfig --list | grep atd   # at服务是否安装
service atd restart   # at服务的启动

实际案例:

代码语言:javascript复制
#示例1.显示工作实际内容
atq  #查询工作号 (计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务)
5       2013-01-06 17:20 a root
at -c 5 #显示工作内容(即脚本内容)
atrm 5 #删除at任务

WeiyiGeek.at-c示例

代码语言:javascript复制
#示例2.添加计划任务(三天后的下午执行/bin/ls)
$at 5pm 3 days
at> /bin/ls
at> <EOT>
job 7 at 2013-01-08 17:00


#示例3.明天17点钟,输出时间到指定文件内:
$at 17:20 tomorrow
at> date >/root/2013.log
at> <EOT>
job 8 at 2013-01-06 17:20


#示例4.两分钟后执行helo.sh脚本, 写完回车 出现下面的at提示符
$at now   2 minutes 
at> /root/helo.sh >> /root/helo.log
#ctrl D 保存或<EOT>

crontab 命令

描述:crontab是Linux中非常强大并且常用的定时周期性任务执行,它与windows下的计划任务类似,系统默认会安装此服务工具,并且会自动启动crond进程,该进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务则自动执行该任务。

crond服务启动与停止:

代码语言:javascript复制
systemctl start crond
systemctl stop crond

#查看是否安装和启动
systemctl list-unit-files | grep "crond"
crond.service     enabled

#重新载入配置
/sbin/service crond reload

与at命令使用限制一样:

  • /etc/cron.deny 该文件中所列用户不允许使用crontab命令
  • /etc/cron.allow 该文件中所列用户允许使用crontab命令

基础语法和参数:

代码语言:javascript复制
crontab [选项] [crontab文件]
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。

格式说明:

代码语言:javascript复制
#(1) 注意版本不同:需要首先查看系统任务调度的配置文件 /etc/crontab
cat /etc/crontab
#前四行是用来配置crond任务运行的环境变量()
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="root"
# 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  #代表每1分执行
minute   hour   day   month   week  executeuser command     #顺序:分 时 日 月 周

#(2)用户任务调度定义的crontab文件都被保存在/var/spool/cron目录中
/var/spool/cron/   #所有用户crontab文件存放的目录,以用户名命名

#比如:
f1 f2 f3 f4 f5 program    #其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。
#在以上各个字段中,还可以使用以下特殊字符:
* 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
* 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
* 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
* 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用例如*/10,如果用在minute字段,表示每十分钟执行一次。

#文字说明
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

表达式示例:

代码语言:javascript复制
#示例1.系统任务配置文件案例
*/1 * * * * command   # 每1分钟执行一次command
*/1 * * * * date  %H:%M:%S > /tmp/test.log
* */1 * * * /etc/init.d/smb restart  #每一小时执行一次 
0 0 */10 * * ls   #每隔10天执行一次 ls  

30 21 * * * /etc/init.d/smb restart  # 每晚的21:30重启smb 
6 14 * * fri /disk/monitor.sh  #星期五的14点6分执行该脚本


#示例2.特殊字符使用
3,15 * * * * command      #每小时的第3和第15分钟执行
3,15 8-11 */2 * * command   #每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command     #每个星期一的上午8点到11点的第3和第15分钟执行
45 4 1,10,22 * * /etc/init.d/smb restart    # 每月1、10、22日的4 : 45重启smb 
0 11 4 * mon-wed /etc/init.d/smb restart   # 每月的4号与每周一到周三的11点重启smb 
0 4 1 jan * /etc/init.d/smb restart  # 一月一号的4点重启smb
31 10 */2 * * /usr/bin/backup # 每隔两天 1 、3、5、7....2n-1 的 10点31分进行执行backup备份


#示例3.进阶的使用
# 在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
# 周一到周五每天下午 5:00 寄一封信给 alex@domain.name
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
# 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分,相当于每隔两个小时执行 echo "haha"
20 0-23/2 * * * echo "haha"

实际案例:

代码语言:javascript复制
#1) 下面命令是捆绑用户身份的是谁执行的命令就谁来管,如果忽略用户的任务则需要编辑/etc/crontab文件.
crontab -e   #进入crontab编辑界面会打开vim编辑你的工作.

#示例2.指定用户任务调度并查看(每分钟、每两秒进行执行)
crontab -u apache -e  
crontab -l
* * * * * /tmp/test.sh    #一定要采用脚本的方式,且不要忘记可执行权限;
### test.sh ##
#!/bin/bash
while :
do
echo $(date " %y:%M:%S") >>/tmp/test.log
sleep 2
done
## end ###


#示例3.特殊文件夹
01 * * * * root run-parts /etc/cron.hourly  # 每小时执行/etc/cron.hourly目录内的脚本

#示例4.注意:如果60不能整除间隔的秒数,则需要调整执行的时间。
#例如需要每7秒执行一次,就需要找到7与60的最小公倍数,7与60的最小公倍数是420(即7分钟)。
#则 crontab.sh step的值为7,循环结束条件i<420

#!/bin/bash 
step=7 #间隔的秒数,不能大于60 
for (( i = 0; i < 60; i=(i step) )); do
  $(php '/home/fdipzone/php/crontab/tolog.php') 
  sleep $step 
done
exit 0
#crontab -e 可以输入以下语句来实现
*/7 * * * * /home/fdipzone/php/crontab/crontab.sh

#示例5.还能采用@ 时间进行表示执行的时间
@daily/hourly/monthly/weekly/reboot/yearly
#表示每次系统启动后需要执行一次计划任务,具体任务为输出test字符
@reboot echo test
#表示每小时执行一次计划任务,具体任务 为输出test字符
@hourly echo test

WeiyiGeek.示例2

补充入坑 问题1:crontab报错:errors in crontab file, can’t install 问题原因:采用Quartz生成或输入的crond表达式是错误的 问题解决:

代码语言:javascript复制
#根据网站上的Cron表达式生成器生成的(巨坑)
0/0 0/4 * * * ? 脚本
#修改后的Cron表达式即可完美解决问题
* */4 * * * ? 脚本

问题2:crontab未按照定时任务报错 (mailed 58 bytes of output but got status 0x007f#012) 新手常遇到 问题描述:

代码语言:javascript复制
#crond 日志查看
cat /var/log/cron
Jun  8 16:25:01 node2 CROND[67651]: (root) CMD (sh /tmp/WebMonitor.sh)
Jun  8 16:25:01 node2 CROND[67649]: (root) MAIL (mailed 58 bytes of output but got status 0x007f#012)  #错误信息

问题原因:脚本中的由于环境变量的原因未执行phantomjs脚本

代码语言:javascript复制
#排错0.服务信息查看
$systemctl status crond
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2020-06-08 15:48:58 CST; 53min ago
 Main PID: 65217 (crond)
    Tasks: 1
   Memory: 672.0K
   CGroup: /system.slice/crond.service
           └─65217 /usr/sbin/crond -n

#排查1.查询sendmail发信的错误信息
$ systemctl restart postfix
$ cat /var/spool/mail/root
From root@node2.localdomain  Mon Jun  8 16:37:18 2020
Return-Path: <root@node2.localdomain>
X-Original-To: root
Delivered-To: root@node2.localdomain
Received: by node2.localdomain (Postfix, from userid 0)
        id 3D29166DC22A; Mon,  8 Jun 2020 16:30:02  0800 (CST)
[Error] Phantomjs NotFound,Please Install this!
您在 /var/spool/mail/root 中有邮件

#排查2.利用脚本重定向错误输出
$ crontab -e
*/1 * * * * sh /tmp/WebMonitor.sh >xxx.log 2>&1 #默认路径是用户家/xxx.log

问题解决:

代码语言:javascript复制
# 脚本中加上绝对路径
# phantomjs缩略图生成
/usr/local/src/phantomjs/bin/phantomjs -v > /dev/null 2>&1
if [[ "$?" != "0" ]];then echo -e "e[31m[Error] Phantomjs NotFound,Please Install this! e[0m";exit 0;fi

问题3. crontab 异常不运行、不报错、无日志? 描述: debug 终极大法还是得看日志, 通过以下方式进行开启日志记录;

代码语言:javascript复制
# 错误信息排查
systemctl status cron.service

# Ubuntu 开启crontab 日志记录
$ vim /etc/rsyslog.d/50-default.conf
cron.*   /var/log/cron.log  # 取消注释即可

问题4.在 auth.log出现Cron: pam_unix (cron:session): session opened/closed for user root by (uid=0) 或者 journalctl -u cron -f 出现 pam_unix(cron:session): session closed for user 问题原因: 当cron这样运行时它通常作为根用户运行,这样做会为该用户创建一个会话。由于大多数linice的默认设置被记录在auth.log中(如果不是那么烦人的话这看起来是谨慎的)。没有保持用户会话持久服务导致无法执行crontab任务 解决方案:

代码语言:javascript复制
# (1) 在Debian/Ubuntu上
vim /etc/pam.d/common-session-noninteractive
session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid
session required pam_unix.so  # Above this line, add the upper 在此行之上添加上面的这一行

# (2) Save the file and exit.Restart crond using something like service cron restart.
systemctl restart cron.service
  # ● cron.service - Regular background program processing daemon
  #     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
  #     Active: active (running) since Fri 2021-02-26 15:23:25 CST; 6s ago
  #       Docs: man:cron(8)
  #   Main PID: 1266507 (cron)
  #     Tasks: 1 (limit: 19114)
  #     Memory: 428.0K
  #     CGroup: /system.slice/cron.service
  #             └─1266507 /usr/sbin/cron -f

  # Feb 26 15:23:25 gitlab-weiyigeek systemd[1]: Started Regular background program processing daemon.
  # Feb 26 15:23:25 gitlab-weiyigeek cron[1266507]: (CRON) INFO (pidfile fd = 3)
  # Feb 26 15:23:25 gitlab-weiyigeek cron[1266507]: (CRON) INFO (Skipping @reboot jobs -- not system startup)

问题5.cron服务日志报No MTA installed, discarding output错误。 描述: 老版的cron计划任务,日志输出到解决办法/var/log/syslog 解决办法: 定时任务尾部增加重定向输出到log的参数,例:>/var/log/cron.log 2>&1

问题6.docker容中成功执行crontab任务。

代码语言:javascript复制
# 1.在宿主机里面以及容器里面安装crontab执行都不成功
1 3  * * * root  cd /data/wwwroot/xxx && docker-compose exec app php think xxx >> /var/log/crontab_xxx.log

# 2.我们可以装上rsyslog 或者采用journalctl进行日志查看
tail -f /var/log/syslog

# 3.修改 /etc/pam.d/cron 并重启cron,运行成功
注释掉 session required pam_loginuid.so
# dockerfile 构建时: 
RUN sed -i '/session    required   pam_loginuid.so/c#session    required   pam_loginuid.so' /etc/pam.d/crond

附录:在线Cron表达式生成器

  • http://www.toolzl.com/tools/croncreate.html

anacron 命令

描述:它只是cron的补充而非是完全替代cron,cron 是作为守护进程运行的,而anacron则作为普通进程运行并终止的。 anacron 维护了一组应当运行的任务,每个任务都一个相关的运行间隔,anacron 并不能指定何时运行某项任务,而是以天为单位或者是在启动后立刻进行 anacron 的动作,当系统启动之后anacrod将会去侦测停机期间应该进行但是并没有进行的 crontab 任务,并将该任务运行一遍后,然后 anacron 就会自动停止了

因此 anacron 运行的时间通常有两个:

  • 一个是系统启动期间运行
  • 一个是写入 crontab 中的任务

anacron配置(系统错峰运行定时任务),防止机器被意外关机,一旦开机恢复正常会检查关机期间有没有遗漏定时任务,如果遗漏就会重新再次执行遗漏部分

  • 执行cron的时间 系统把上次执行期间和当前时间比较,如两个差值超过anacron规定的时间差值
  • 证明有cron任务被漏执行 anacron自动执行漏执行任务 #保证系统关机期间错过的定时任务,在系统开机后再自动执行

anacron检查周期:

  • anacron使用一天/一周/一月作为检测周期
  • /var/spool/anacron/cron{hourly,daily,weekly,monthly} 该目录中文件用于记录上次

以cron.daily工作来说明执行过程? 答:首先读取/var/spool/anacron/cron.daily中的上一次anacron执行的时间;

  • 和当前时间比较,如果两个时间的差值超过1天,就执行cron.daily工作
  • 执行工作的自能在3~22点,当然您可以进行更改;
  • 默认执行工作使强制延迟时间为5分钟,再随机延迟0-45分钟时间
  • 使用nice命令指定默认的优先级,再使用run-parts脚本执行cron.daily目录中所有的可执行文件

配置文件:

代码语言:javascript复制
#语法
run-parts [--list | --test] <dir>

/etc/cron.d/  #存放配置的文件
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly

实际案例:

代码语言:javascript复制
$vi /etc/anacrontab   # 配置文件 Centos 7.0
#环境变量
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45  #最大时间延迟
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22  #anacron 的执行时间范围是3:00-2:00

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
1(天数)   5(Delay延迟 Minutes)  cron.daily(Jobs Name)  nice run-parts /etc/cron.daily(Command)

anacron和cron服务有什么区别 :

  • 系统差异: 在Centos6.x中会anacron调用,避免了重复执行,在Centos7.x中anacron不再是服务,而是命令.、
  • cron 是用来控制循环执行的例行性工作的,可循环的时间为分钟、小时、每周、每月或每年等.
  • anacron 是用于处理非 24 小时一直启动的 Linux 系统的 cron 服务的执行。(及特殊情况使计划任务中断或者未被执行的)
    • 所以 anacron 并不能指定何时执行某项任务, 而是以天为单位或者是在开机后立刻进行 anacron 的动作,他会去侦测停机期间应该进行但是并没有进行的 cron服务,如果有就将该任务执行一遍,然后就自动停止。

总结:

  • 建议执行脚本放在目录中

0x03 程序执行

setsid 命令 - 在新会话中运行程序。

描述: 默认我们从父进程继承了SessionID、进程组ID和打开的终端,如果我们新创建得子进程要脱离继承得终端则可以通过setsid命令来实现。

Tips: 即setsid是帮助一个进程脱离从父进程继承而来的已打开的终端、隶属进程组和隶属的会话。

语法参数:

代码语言:javascript复制
Usage:
 setsid [options] <program> [arguments ...]

Options:
 -c, --ctty     将控制终端设置为当前控制终端
 -f, --fork     always fork
 -w, --wait     等待程序退出,并使用相同的返回

使用演示:

代码语言:javascript复制
# 1.在新的会话中运行程序及命令
~# setsid ping www.weiyigeek.top -c 32
~$ ps -ef | grep "www.weiyigeek.top"
  root      168665       1  0 16:21 ? (关键点)   00:00:00 ping www.weiyigeek.top -c 32
  weiyi      168669  168584  0 16:21 pts/1       00:00:00 grep --color=auto www.weiyigeek.top

# 2.在新的会话中指定运行用户程序及命令
~$ setsid sudo -u elk ping www.weiyigeek.top -c 32
~$ ps -ef | grep "www.weiyigeek.top"
  # root      168748       1  0 16:24 ?        00:00:00 sudo -u elk ping www.weiyigeek.top -c 32
  # elk       168749  168748  0 16:24 ?        00:00:00 ping www.weiyigeek.top -c 32
  # weiyi      168755  168584  0 16:25 pts/1    00:00:00 grep --color=auto www.weiyigeek.top

0 人点赞