精华内容
下载资源
问答
  • 用Python脚本结合Linux的crontab、windows服务程序,实现了一个基于widows服务程序的定时任务管理器。
  • C#创建计划任务,开机自动执行的代码,完美执行已测
  • 计划任务

    千次阅读 2018-07-27 16:15:25
    计划任务就是一个在机器开机的情况下会按着计划来执行的一个操作。为什么会有计划任务这个东西呢?我觉得,比如每天十点备份,每天晚上一点爬取一些数据等等,但是如果让人每天都这样去完成这些事情的话,效率会太低...

            计划任务就是一个在机器开机的情况下会按着计划来执行的一个操作。为什么会有计划任务这个东西呢?我觉得,比如每天十点备份,每天晚上一点爬取一些数据等等,但是如果让人每天都这样去完成这些事情的话,效率会太低。所以有了计划任务。Linux和Windows都有计划任务。

     

    计划任务的守护进程是crond

    想运行计划任务的时候必须要确保crond正常

        systemctl    status crond.services

     

    计划任务又分为系统的和用户的

        系统的计划任务可以在/etc/crontab里面写

        系统的计划任务一般用于实现系统自己的维护

     

        用户的计划任务可以用crontab命令来编辑

     

        Crontab命令可以添加或者查看当前用户的计划任务

        crontab命令会把结果通过mail返回值,如果不想接受结果,可以传给数据黑洞/dev/null。或者想记录下来,可以重定向到自己的地方去

     

        crontab     -e    编辑当前用户的计划任务

        crontab     -l    列出当前用户的计划任务

        crontab    -r    移除当前用户的计划任务
     

    (全部都可以加    -u 选项,但是只有root用户以及特别的提权了的用户才可以用)

     

     

        crontab     -e

     

      写计划任务是有一个格式的:

                格式可以在/etc/crontab里面有

     

    五个*分别代表分(0-59),时(0-23),日(1-31),月(1-12),周内的日(0-6)0或者7是表示星期日。

     

    *写的东西不同,意思也不一样。

    假设在第一段

    如果*写*的话,每分钟都执行

    如果写2的话,每小时的第二分钟执行

    如果写*/2的话,每隔两分钟执行一次

    如果写成2-6,就是2分钟到6分钟每分钟执行一次

    如果写成2,5,就是第二分钟和第五分钟都执行一次

     

    一般,我们不会直接把命令写到crontab -e的页面上,一般会把命令写到脚本,把脚本放到crontab -e上面执行

     

    如果脚本没有给执行权限的话,执行的时候会执行不了,然后会在该用户的邮箱里面有提示

    脚本一定要+运行权限

    chmod +x  脚本

     

    crontab     -l     查询自己的任务

     

    crontab    -l    -u user1

    查询user1的任务

    但是只可以是root来执行

     

    如果不是root 的话会看不见

    不过可以sudo提权来执行这个命令(用户提权可以在/etc/sudoers写,也可以吧普通用户加到wheel组里面)

    crontab    -r 删除用户的计划任务

    不加上-u指定用户,一删会删完自己当前的计划任务

     

    同样的,-r -u 需要要一定的权限,只可以root执行,其他普通用户执行得提权

    crontab -r 和rm -rf * 一样要慎用,把重要的计划任务删除掉就完蛋了

     

    如果想删除某一条计划任务的话,要先-e编辑,/查找,然后dd删除,wq保存退出

     

    除了周期性的计划任务,还有一次性的计划任务,就是在未来某一时刻执行一个任务

     

     

    可以使用at命令

    at 加上时间点

    然后加入命令,

    ctrl+D结束

    结束之后

     

    at -d 加数字

    指定删除某一条任务

     

    展开全文
  • Linux计划任务与日志管理

    万次阅读 2019-04-22 23:01:44
    计划任务-at-cron-计划任务使用方法 日志的种类和记录方式-自定义ssh服务日志类型和存储位置 实战-日志切割-搭建远程日志收集服务器 实战-配置公司内网服务器每天定时自动开关机 1、计划任务-at-cron-计划任务使用...
    • 计划任务-at-cron-计划任务使用方法
    • 日志的种类和记录方式-自定义ssh服务日志类型和存储位置
    • 实战-日志切割-搭建远程日志收集服务器
    • 实战-配置公司内网服务器每天定时自动开关机

    1、计划任务-at-cron-计划任务使用方法

    计划任务的安排方式分为两种:
    一种是定时性的:也就是例行。就是每隔一定的周期就要重复来做这个事情
    一种是突发性的:就是这次做完了这个事情,下次就没有了。临时决定,只有一次执行

    at和crontab这两个命令
    at:可以处理仅执行一次就结束的命令
    crontab:会把你指定的工作或任务,比如:脚本等,按照设定的周期循环执行

    at命令使用方法:
    语法:at 时间
    服务名:atd
    例1:查看at服务状态

    [root@xuegod140 ~]# systemctl status atd #查看服务状态
    [root@xuegod140 ~]# systemctl enable atd #开机启动atd服务
    [root@xuegod140 ~]# systemctl disable atd #开机不启动atd服务
    [root@xuegod140 ~]# systemctl start atd #开启atd服务
    [root@xuegod140 ~]# systemctl stop atd #关闭atd服务

    centos6查看开机启动服务:

    [root@xuegod140 ~]# chkconfig --list | grep atd #7上无法执行

    例2:使用at创建任务计划

    [root@xuegod140 ~]# at 23:33 #23:33创建一个test目录
    at> mkdir /tmp/test
    at>
    job 1 at Tue Apr 16 23:33:00 2019
    [root@xuegod140 ~]# at -l #查看计划任务,atq也可以查看计划任务
    1 Tue Apr 16 23:33:00 2019 a root
    [root@xuegod140 ~]# ls -ld /tmp/test/
    drwxr-xr-x 2 root root 6 Apr 16 23:33 /tmp/test/

    注:任务执行完了后,会自动删除。

    例3:at计划任务的特殊写法

    [root@xuegod140 ~]# at now +50min #当前时间50分钟以后执行任务
    [root@xuegod140 ~]# at 20:00 2019-4-17 #2019-4-17 20:00 执行任务
    [root@xuegod140 ~]# at 6:00 +3days #三天以后的6:00执行任务

    例4:at计划任务的目录文件

    [root@xuegod140 ~]# ls /var/spool/at/a00002018b912b
    /var/spool/at/a00002018b912b
    [root@xuegod140 ~]# tail -3 !$
    tail -5 /var/spool/at/a00002018b912b
    rm -rf /tmp/test
    marcinDELIMITER13ba1c4f
    [root@xuegod140 ~]# atq
    2Wed Apr 17 00:43:00 2019 a root
    [root@xuegod140 ~]# at -c 2 | tail -3
    rm -rf /tmp/test
    marcinDELIMITER13ba1c4f

    注:两种查看计划任务内容的方式,一种通过查看at的文件,一种at -c 任务号查看
    注:在xshell终端中,如果按下ctrl+s,会锁定当前终端,无法使用;按下ctrl+q接触锁定

    例5:计划任务的删除
    命令:atrm 任务编号

    [root@xuegod140 ~]# atq
    2 Wed Apr 17 00:43:00 2019 a root
    [root@xuegod140 ~]# atrm 2
    [root@xuegod140 ~]# atq

    2、crontab定时任务使用方法

    crontab file是用来定义定时任务条目的文件,在Linux中,这个文件有存在几个地方
    系统执行的工作 updatedb、whatis、/etc/cron.d/*
    用户自己定义的任务文件 /var/spool/cron/USERNAME

    cron命令参数:

    • crontab -u 用户名 #指定XX用户的cron服务
    • crontab -l #列出当前用户下的cron的详细内容
    • crontab -u zx -l #列出zx用户下的cron的详细内容
    • crontab -r #删除所有用户的cron内容,普通用户执行,只删除自己的cron内容
    • crontab -r -u zx #删除zx用户的cron内容
    • crontab -e #编辑cron服务

    cron -e 编辑时的语法:
    分为7个字段:分 时 日 月 周 用户 命令

    • 分:0-59取值
    • 时:0-23取值,24点即使0点
    • 日:1-31取值
    • 月:1-12取值,或者直接月份的英文单词
    • 周:0-6取值,0或者7表示星期天

    特殊符号的含义:

    • *:任意/每
    • /:指定时间的间隔频率;*/10=每隔十分钟(位于分字段);0-23/2=每隔两小时
    • -:代表从某个数字到某个数字:8-17=8号到17号(日字段)
    • ,:分开几个离散的数字:6,10-13,20=6号,10号到13号,20号(日字段)

    例1:cron服务的管理

    [root@xuegod140 ~]# systemctl status crond
    [root@xuegod140 ~]# systemctl start crond
    [root@xuegod140 ~]# systemctl stop crond
    [root@xuegod140 ~]# systemctl enable crond
    [root@xuegod140 ~]# systemctl disable crond

    例2:每天凌晨2点1分开始备份数据

    [root@xuegod140 ~]# crontab -e
    no crontab for root - using an empty one
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l
    1 2 * * * tar cf /opt/grub.tar /boot/grub/

    例3:以zx用户,创建一个计划任务

    [root@xuegod140 ~]# crontab -u zx -e
    no crontab for zx - using an empty one
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l
    1 2 * * * tar cf /opt/grub.tar /boot/grub/
    [root@xuegod140 ~]# crontab -u zx -l #加上-u可以查看单个用户的计划任务
    1 * * * * echo “hello word” > /dev/null

    例4:查看所有的计划任务

    -rw------- 1 root root 43 Apr 17 00:22 root
    -rw------- 1 root root 41 Apr 17 00:25 zx
    [root@xuegod140 ~]# cat !$/root
    cat /var/spool/cron//root
    1 2 * * * tar cf /opt/grub.tar /boot/grub/
    [root@xuegod140 ~]# cat /var/spool/cron/zx
    1 * * * * echo “hello word” > /dev/null

    例5:每月的1,10,22号4:45分在/tmp/创建一个a.txt

    [root@xuegod140 ~]# crontab -e
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l
    45 4 1,10,22 * * touch /tmp/a.txt

    例6:每月的1到10号的4:45,输入hello word

    [root@xuegod140 ~]# crontab -e
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l
    45 4 1-10 * * echo “hello word”

    例7:每隔2天的8-11点的3分和15分,创建一个/tmp/b.txt

    [root@xuegod140 ~]# crontab -e
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l
    3,15 8-11 */2 * * touch /tmp/b.txt

    例8:周一到周五的21:15,创建/tmp/d.txt

    [root@xuegod140 ~]# crontab -e
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l
    15 21 * * 1-5 touch /tmp/d.txt

    例9:删除cron计划任务

    [root@xuegod140 ~]# crontab -l
    1 2 * * * tar cf /opt/grub.tar /boot/grub/
    45 4 1,10,22 * * touch /tmp/a.txt
    45 4 1-10 * * echo “hello word”
    3,15 8-11 */2 * * touch /tmp/b.txt
    15 21 * * 1-5 touch /tmp/d.txt
    [root@xuegod140 ~]# crontab -r
    [root@xuegod140 ~]# crontab -l
    no crontab for root

    注:cron计划任务中如果出现%号,必须加转义符,不然表示换行意思

    例10:crontab不支持每秒。每10秒执行一次脚本

    [root@xuegod140 ~]# crontab -e
    crontab: installing new crontab
    You have new mail in /var/spool/mail/root
    [root@xuegod140 ~]# crontab -l

            • sleep 10;echo $(date +"%F %T") >> a.txt
            • sleep 20;echo $(date +"%F %T") >> a.txt # 黑点实际是*
            • sleep 30;echo $(date +"%F %T") >> a.txt
            • sleep 40;echo $(date +"%F %T") >> a.txt
            • sleep 50;echo $(date +"%F %T") >> a.txt

    [root@xuegod140 ~]# cat a.txt
    2019-04-17 01:06:11
    2019-04-17 01:06:21
    2019-04-17 01:06:31
    2019-04-17 01:06:41
    2019-04-17 01:06:51

    3、系统级别的计划任务

    系统任务调度配置文件

    [root@xuegod140 ~]# ll /etc/crontab
    -rw-r–r--. 1 root root 451 Jun 10 2014 /etc/crontab
    [root@xuegod140 ~]# cat /etc/crontab
    SHELL=/bin/bash #指定操作系统使用哪个shell
    PATH=/sbin:/bin:/usr/sbin:/usr/bin #系统执行命令的搜索路径
    MAILTO=root #将执行任务的信息通过mail发送给XX用户
    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 # 黑点实际是*

    我们也可以直接在配置文件中添加计划任务

    /etc/con.d/目录下文件说明:
    cron.deny #控制用户是否能做计划任务的文件;
    cron.monthly #每月执行的脚本;
    cron.weekly #每周执行的脚本;
    cron.daily #每天执行的脚本;
    cron.hourly #每小时执行的脚本;
    crontab #主配置文件

    4、案例要求:

    每天2:00备份/etc/目录到/tmp/backup/目录下;
    将备份命令写入一个脚本中
    每天备份文件名要求格式:2017-08-19_etc.tar.gz
    在执行计划任务时,不要输出任务信息
    存放备份内容的目录要求只保留三天的数据
    实验步骤:
    创建备份文件的存放目录:

    [root@xuegod140 ~]# mkdir /tmp/backup

    编写执行脚本,因为需要备份/etc目录,所以需要使用到tar命令;
    备份的文件只保留三天,所以需要删除三天以前的数据,使用find命令
    将上述的两条命令,写到脚本文件

    [root@xuegod140 ~]# vim back.sh
    [root@xuegod140 ~]# cat back.sh
    #!/bin/bash
    find /tmp/backup/ -name “.tar.gz" -mtime +3 -delete
    #find /tmp/backup/ -name "
    .tar.gz” -mtime +3 -exec rm -rf {} ;
    #find /tmp/backup/ -name “*.tar.gz” -mtime +3 | xagre rm -rf
    tar zcvf /tmp/backup/date +%F_etc.tar.gz /etc

    编写crontab任务,按照每天2:00备份,设置计划任务

    [root@xuegod140 ~]# crontab -e
    crontab: installing new crontab
    [root@xuegod140 ~]# crontab -l #因为需要立即看到实验效果,所以时间不同
    39 20 * * * bash /root/back.sh &> /dev/null
    [root@xuegod140 ~]# ls /tmp/backup/
    2019-04-17_etc.tar.gz

    这里为了能看到find的命令的效果,我们先修改日期后,手动执行脚本文件

    [root@xuegod140 ~]# date -s “2019-04-18”
    [root@xuegod140 ~]# date
    Thu Apr 18 00:05:56 CST 2019
    [root@xuegod140 ~]# bash back.sh
    [root@xuegod140 ~]# date -s “2019-04-19”
    Fri Apr 19 00:00:00 CST 2019
    [root@xuegod140 ~]# bash back.sh
    [root@xuegod140 ~]# date -s “2019-04-20”
    Sat Apr 20 00:00:00 CST 2019
    [root@xuegod140 ~]# date -s “2019-04-21”
    Sun Apr 21 00:00:00 CST 2019
    [root@xuegod140 ~]# bash back.sh
    [root@xuegod140 ~]# ll /tmp/backup/
    total 52520
    -rw-r–r-- 1 root root 10755840 Apr 19 00:00 2019-04-19_etc.tar.gz
    -rw-r–r-- 1 root root 10755840 Apr 20 00:00 2019-04-20_etc.tar.gz
    -rw-r–r-- 1 root root 10755840 Apr 21 00:00 2019-04-21_etc.tar.gz

    注:-mtime +3 :不包含当前的天数,往前数三天

    5、日志的种类

    在centos7中,系统日志消息有两个服务负责处理:systemd-journald和rsyslog
    常见日志文件概述:/var/log目录保管由rsyslog维护的,里面存放的一些特定于系统和服务的日志文件
    日志文件 用途
    /var/log/message 大多数系统日志消息记录在此处。有也例外的:如与身份验证,电子邮件处理相关的定期作业任务等
    /var/log/secure 安全和身份验证相关的消息和登录失败的日志文件。 ssh远程连接产生的日志
    /var/log/maillog 与邮件服务器相关的消息日志文件
    /var/log/cron 与定期执行任务相关的日志文件
    /var/log/boot.log 与系统启动相关的消息记录
    /var/log/dmesg 与系统启动相关的消息记录

    例1:查看那个IP地址经常暴力破解系统用户密码

    [root@xuegod140 log]# ssh root@192.168.1.140 #先故意输错3次密码
    [root@xuegod140 log]# grep -i failed /var/log/secure #-i忽略大小写,查看登录失败的信息
    Apr 17 01:08:01 xuegod140 CROND[5527]: pam_systemd(crond:session): Failed to release session: Interrupted system call
    Apr 21 20:25:01 xuegod140 sshd[1920]: Failed password for root from 192.168.1.140 port 43712 ssh2
    Apr 21 20:25:04 xuegod140 sshd[1920]: Failed password for root from 192.168.1.140 port 43712 ssh2
    Apr 21 20:25:07 xuegod140 sshd[1920]: Failed password for root from 192.168.1.140 port 43712 ssh2
    [root@xuegod140 log]# grep -i failed /var/log/secure | awk ‘{print $11}’ #打印第11列内容
    192.168.1.140
    192.168.1.140
    192.168.1.140
    [root@xuegod140 log]# grep -i failed /var/log/secure | awk ‘{print $11}’| uniq -c #uniq 去除重复项,-c 统计个数
    3 192.168.1.140

    例2:/var/log/wtmp文件作用
    wtmp是一个二进制文件,记录每个用户登录次数和持续时间等信息

    [root@xuegod140 log]# last
    root pts/0 192.168.1.188 Sun Apr 21 20:15 still logged in
    #登录用户 虚拟终端 登录终端的IP 登录日志 仍然登录中
    root pts/1 192.168.1.188 Wed Apr 17 20:23 - down (2+03:52)

    可以使用last命令输入wtmp中的内容,last 显示到目前为止,成功登录系统的记录
    或者:

    [root@xuegod140 log]# last -f /var/log/wtmp
    root pts/0 192.168.1.188 Sun Apr 21 20:15 still logged in
    reboot system boot 3.10.0-862.el7.x Wed May 22 11:29 - 20:36 (10196+10:07

    例3:/var/log/btmp文件作用
    查看暴力破解系统用户;btmp文件记录错误登录系统的日志,如果发现此文件大于1M,就就说明有很多人在暴力破解ssh服务,此日志需要用lastb命令查看

    [root@xuegod140 log]# lastb #可以看到刚刚登录失败的三次记录
    root ssh:notty 192.168.1.140 Sun Apr 21 20:25 - 20:25 (00:00)
    root ssh:notty 192.168.1.140 Sun Apr 21 20:25 - 20:25 (00:00)
    root ssh:notty 192.168.1.140 Sun Apr 21 20:25 - 20:25 (00:00)
    [root@xuegod140 log]# ll -h btmp #此文件大于1M,就说明有人暴力破解
    -rw-------. 1 root utmp 1.5K Apr 21 20:25 btmp

    例4:btmp文件信息过多时,我们需要查看某个IP地址的暴力破解次数

    [root@xuegod140 log]# lastb | awk ‘{print $3}’ |sort -n|uniq -c #查看所有登录失败的IP地址
    3 192.168.1.140
    或者
    [root@xuegod140 log]# lastb | awk ‘{print $3}’ | grep 192.168.1.140 | wc -l #查看某个IP地址
    3

    例5:清空日志
    方法1:

    [root@xuegod140 log]# > /var/log/secure #使用重定向清空日志文件

    方法二:

    [root@xuegod140 log]# rm -rf /var/log/btmp && touch /var/log/btmp #先删除后创建

    上述两种方法,建议使用第一种,使用方法二,新创建的文件会重新生成inode号,服务使用的还是旧的inode号和文件描述符,需要手动重启服务加载新的inode号才生效。
    方法一,不改变文件的inode和描述符信息。

    5、日志的记录方式

    分类和级别
    日志的分类:
    daemon 后台进程相关
    kern 内核产生的信息
    lpr 打印系统产生的
    authpriv 安全认证相关
    cron 计划任务相关
    mail 邮件相关
    syslog 日志服务本身的
    news 新闻系统
    local0-7 自定义的日志设备
    local0-7 8个系统保留的类,供其它的程序使用或者是用户自定义

    日志的级别
    从轻>>>重

    6、rsyslog日志服务

    rhel5 服务名称syslog 配置文件 /etc/syslog.conf
    rhel6/7 服务名称rsyslog 配置文件/etc/rsyslog.conf
    查看配置文件信息:

    [root@xuegod140 ~]# grep -v “#|$” /etc/rsyslog.conf
    $ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
    $ModLoad imjournal # provides access to the systemd journal
    $WorkDirectory /var/lib/rsyslog
    $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
    $IncludeConfig /etc/rsyslog.d/.conf
    $OmitLocalLogging on
    $IMJournalStateFile imjournal.state
    .info;mail.none;authpriv.none;cron.none /var/log/messages
    authpriv.
    /var/log/secure
    mail.
    -/var/log/maillog
    cron.* /var/log/cron
    .emerg :omusrmsg:
    uucp,news.crit /var/log/spooler
    local7.* /var/log/boot.log

    注释:
    #UDPServerRun 514 #允许 514 端口接收使用 UDP 协议转发过来的日志
    #InputTCPServerRun 514 #允许 514 端口接收使用 TCP 协议转发过来的日志

    例:kern.* /dev/console #所有内核级别的日志存放到/dev/console
    .info;mail.none #所有类型的info级别,除mail类型外
    authpriv.
    #所有认证级别的日志存放到 /var/log/secure
    cron.* #计划任务类型的所有级别存放到 /var/log/cron
    .emerg #所有类型的紧急级别,存放到 :omusrmsg:
    local7.* #local7类型的所有级别,存放到 /var/log/boot.log
    注:
    mail.* -/var/log/maillog
    “-”:邮件的信息比较多,先将数据存储到内存,达到一定大小,全部写到硬盘。有利于减少硬盘IO进程的开销,数据存储在内存,如果关机不当数据消失。

    7、日志输入的规则

    .info 大于等于info级别的信息全部记录到某个文件
    .=级别 仅记录等于某个级别的日志
    例:.=info 只记录info级别的日志
    .! 级别 除了某个级别以外,记录所有的级别信息
    例:.!err 除了err级别以外,记录其它所有级别所有信息
    .none 指的是排除某个类别
    例: mail.none mail类型的所有级别都不记录

    实战:自定义ssh服务的日志类型和存放位置
    第一:修改ssh服务配置文件sshd.conf存放日志的类别
    复制原来的日志存放类别,然后自定义一个local0类别

    [root@xuegod140 ~]# vim /etc/ssh/sshd_config
    32 #SyslogFacility AUTHPRIV
    33 SyslogFacility local0

    第二:修改系统日志配置文件rsyslog.conf的分类和级别
    增加新的local0分类的所有级别存放到/var/log/sshd.log

    [root@xuegod140 ~]# vim /etc/rsyslog.conf
    72 # Save boot messages also to boot.log
    73 local7.* /var/log/boot.log
    74 local0.* /var/log/sshd.log

    第三:重启服务

    [root@xuegod140 ~]# systemctl restart rsyslog.service
    [root@xuegod140 ~]# systemctl restart sshd

    第四:查看ssh服务日志文件

    [root@xuegod140 ~]# ls /var/log/sshd.log
    /var/log/sshd.log
    [root@xuegod140 ~]# cat !$
    cat /var/log/sshd.log
    Apr 22 00:36:11 xuegod140 sshd[5223]: Server listening on 0.0.0.0 port 22.
    Apr 22 00:36:11 xuegod140 sshd[5223]: Server listening on :: port 22.

    第五:使用ssh登录,进行测试
    第一次登录失败,第二次登录成功,查看日志文件

    [root@xuegod140 ~]# tail -2 /var/log/sshd.log
    Apr 22 00:38:18 xuegod140 sshd[5250]: Failed password for root from 192.168.1.103 port 51101 ssh2
    Apr 22 00:38:21 xuegod140 sshd[5250]: Accepted password for root from 192.168.1.103 port 51101 ssh2

    注:没有修改前,ssh服务的所有日志都是存放到/var/log/secure文件中

    8、日志切割

    在 linux 下的日志会定期进行滚动增加,我们可以在线对正在进行回滚的日志进行指定大小的切割(动态),如果这个日志是静态的。比如没有应用向里面写内容。那么我们也可以用 split 工具进行切割;其中 Logrotate 支持按时间和大小来自动切分,以防止日志文件太大。
    logrotate命令配置文件:
    主配置文件/etc/logrotate.conf
    切割文件:/etc/logrotate.d/ #所有需要自定义的日志切割都需要防止到这个目录下
    logrotate的执行是由cornd服务调用的。

    切割配置文件的其它参数说明:
    monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
    rotate 5: 一次将存储 5 个归档日志。对于第六个归档,时间最久的归档将被删除。
    compress: 在轮循任务完成后,已轮循的归档将使用 gzip 进行压缩。
    minsize:小于1M不切割;maxsize:大于多少进行切割
    delaycompress: 总是不 compress 选项一起用,delaycompress 选项指示 logrotate 不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
    missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
    notifempty: 如果日志文件为空,轮循不会进行。
    create 644 root root: 以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。
    postrotate/endscript: 在所有其它指令完成后,postrotate 和 endscript 里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
    /var/lib/logrotate/status 中默认记录 logrotate 上次轮换日志文件的时间。

    例1:查看logrotate切割的计划任务:

    [root@xuegod140 ~]# ls /etc/cron.daily/logrotate
    /etc/cron.daily/logrotate
    [root@xuegod140 ~]# cat /etc/cron.daily/logrotate
    #!/bin/sh
    /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
    EXITVALUE=$?
    if [ E X I T V A L U E ! = 0 ] ; t h e n / u s r / b i n / l o g g e r − t l o g r o t a t e " A L E R T e x i t e d a b n o r m a l l y w i t h [ EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [ EXITVALUE!=0];then/usr/bin/loggertlogrotate"ALERTexitedabnormallywith[EXITVALUE]"
    fi
    exit 0

    例2:查看logrotate.conf文件

    [root@xuegod140 ~]# grep -v ^$ /etc/logrotate.conf
    #see “man logrotate” for details
    #rotate log files weekly
    weekly #按周进行切割;也可以按天、月、年等切割
    #keep 4 weeks worth of backlogs
    rotate 4 #保留4份,不含自身的一份
    #create new (empty) log files after rotating old ones
    create #切割后创建新文件
    #use date as a suffix of the rotated file
    dateext #以日期作为后缀进行切割
    #uncomment this if you want your log files compressed
    #compress # 是否需要压缩日志
    #RPM packages drop log rotation information into this directory
    include /etc/logrotate.d #将需要切割的日志切割文件放到这个目录内
    #no packages own wtmp and btmp – we’ll rotate them here
    /var/log/wtmp {
    monthly #按月切割
    create 0664 root utmp #创建文件,权限0664 ,用户root,属组utmp
    minsize 1M #文件大小1M,进行切割
    rotate 1 #保留一份,不包含自身
    }
    /var/log/btmp {
    missingok #忽略错误信息
    monthly #按月切割
    create 0600 root utmp #创建新文件等
    rotate 1 #保留一份
    }
    #system-specific logs may be also be configured here.

    例3:查看/etc/logrotate.d/目录下的文件

    [root@xuegod140 ~]# cd /etc/logrotate.d/
    [root@xuegod140 logrotate.d]# ls
    bootlog cups iscsiuiolog libvirtd.qemu ppp samba wpa_supplicant
    chrony httpd libvirtd numad psacct syslog yum
    [root@xuegod140 logrotate.d]# cat syslog
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler #对以上目录按照如下标准进行切割
    {
    missingok #忽略错误
    sharedscripts #使用脚本 postrotate #开始脚本
    /bin/kill -HUP cat /var/run/syslogd.pid 2> /dev/null 2> /dev/null || true
    endscript #结束脚本
    }

    例4:系统日志切割流程
    (1)logrotate的启动脚本被放在了Crontab每天执行的脚本目录中/etc/cron.daily,这样Crontab每天都会执行一次logrotate;

    (2)logrotate启动的时候,使用了配置文件/etc/logrotate.conf;

    (3) 配置/etc/logrotate.conf中又引入了目录:/etc/logrotate.d;

    (4)我们在/etc/logrotate.d目录下建立自己的logrotate配置文件;

    (5)这样,当logrotate启动的时候就会执行一次转储,从而按照我们的配置来转储我们指定的日志文件。

    例5:使用dd命令生产两个文件,进行切割

    [root@xuegod140 opt]# dd if=/dev/zero of=acce.log bs=1M count=100
    100+0 records in
    100+0 records out
    104857600 bytes (105 MB) copied, 0.121766 s, 861 MB/s
    [root@xuegod140 opt]# dd if=/dev/zero of=accf.log bs=1M count=50
    50+0 records in
    50+0 records out
    52428800 bytes (52 MB) copied, 0.0632254 s, 829 MB/s
    [root@xuegod140 opt]# ll -h
    total 150M
    -rw-r–r-- 1 root root 100M Apr 22 02:15 acce.log
    -rw-r–r-- 1 root root 50M Apr 22 02:15 accf.log
    [root@xuegod140 log]# cd /etc/logrotate.d/
    [root@xuegod140 opt]# vim /etc/logrotate.d/acc
    [root@xuegod140 opt]# cat /etc/logrotate.d/acc
    /opt/*.log
    {
    daily
    maxsize 80M
    missingok
    rotate 3
    dateext
    create 0644 root root
    }
    [root@xuegod140 ~]# logrotate -dv /etc/logrotate.d/acc
    reading config file /etc/logrotate.d/acc
    Allocating hash table for state file, size 15360 B
    Handling 1 logs
    rotating pattern: /opt/acce.log
    /opt/accf.log
    after 1 days (3 rotations)
    empty log files are rotated, log files >= 83886080 are rotated earlier, old logs are removed
    considering log /opt/acce.log
    log needs rotating
    considering log /opt/accf.log
    log does not need rotating (log has been rotated at 2019-4-22 2:17, that is not day ago yet)
    rotating log /opt/acce.log, log->rotateCount is 3
    dateext suffix ‘-20190422’
    glob pattern ‘-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’
    glob finding old rotated logs failed
    renaming /opt/acce.log to /opt/acce.log-20190422
    creating new /opt/acce.log mode = 0644 uid = 0 gid = 0
    [root@xuegod140 opt]# systemctl restart rsyslog.service

    强制切割

    [root@xuegod140 ~]# logrotate -fv /etc/logrotate.d/acc
    reading config file /etc/logrotate.d/acc
    Allocating hash table for state file, size 15360 B
    Handling 1 logs
    rotating pattern: /opt/acce.log
    /opt/accf.log
    forced from command line (3 rotations)
    empty log files are rotated, log files >= 83886080 are rotated earlier, old logs are removed
    considering log /opt/acce.log
    log needs rotating
    considering log /opt/accf.log
    log needs rotating
    rotating log /opt/acce.log, log->rotateCount is 3
    dateext suffix ‘-20190422’
    glob pattern ‘-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’
    glob finding old rotated logs failed
    renaming /opt/acce.log to /opt/acce.log-20190422
    creating new /opt/acce.log mode = 0644 uid = 0 gid = 0
    rotating log /opt/accf.log, log->rotateCount is 3
    dateext suffix ‘-20190422’
    glob pattern ‘-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’
    glob finding old rotated logs failed
    renaming /opt/accf.log to /opt/accf.log-20190422
    creating new /opt/accf.log mode = 0644 uid = 0 gid = 0
    [root@xuegod140 ~]# ls /opt/
    acce.log acce.log-20190422 accf.log accf.log-20190422
    [root@xuegod140 ~]# ll -h /opt/
    total 150M
    -rw-r–r-- 1 root root 0 Apr 22 19:32 acce.log
    -rw-r–r-- 1 root root 100M Apr 22 02:23 acce.log-20190422
    -rw-r–r-- 1 root root 0 Apr 22 19:32 accf.log
    -rw-r–r-- 1 root root 50M Apr 22 02:23 accf.log-20190422

    9、配置远程日志服务器-实现日志集中的管理
    实验拓扑图:

    server端配置

    [root@xuegod63 ~]# vim /etc/rsyslog.conf # 使用TCP协议方式,收集日志
    改:19 #KaTeX parse error: Expected 'EOF', got '#' at position 22: …d imtcp 20 #̲InputTCPServerRun 514
    为:
    19 $ModLoad imtcp
    20 $InputTCPServerRun 514

    注:使用UDP协议速度快不保证数据的完整,使用TCP协议可靠.完整

    [root@xuegod63 ~]# systemctl restart rsyslog #重新启动 rsyslog

    查看服务监听的状态:

    [root@xuegod63 ~]# netstat -anlpt| grep 514
    tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 45631/rsyslogd
    tcp6 0 0 :::514 ::? LISTEN 45631/rsyslogd

    服务端验证:
    在服务端关闭selinux和防火墙

    [root@xuegod63 ~]# getenforce
    Enforcing
    [root@xuegod63 ~]# setenforce 0 #关闭selinux功能
    [root@xuegod63 ~]#getenforce
    Permissive
    [root@xuegod63 ~]# systemctl stop firewalld
    [root@xuegod63 ~]# systemctl status firewalld
    [root@xuegod63 ~]# iptables -F #清空防火墙规则

    client端配置
    登录xuegod64.cn

    [root@xuegod63 ~]# vim /etc/rsyslog.conf #在90行之后,插入
    . @@192.168.1.63:514

    注: . 所有类别和级别的日志 ; @@192.168.1.63:514 远端tcp协议的日志服务端的IP和端口
    重启rsyslog 服务

    [root@xuegod64 ~]# systemctl restart rsyslog.service

    查看日志:

    [root@xuegod63 ~]# tail -f /var/log/messages | grep xuegod64 --color #动态查看日志

    在客户端xuegod64进行测试
    语法: logger 要模拟发送的日志

    [root@xuegod64 ~]# logger “aaaaa”
    [root@xuegod63 ~]# tail -f /var/log/messages | grep xuegod64 --color #服务器端到查看消息
    May 21 16:32:16 xuegod64 root: aaaaa

    注:
    总结:服务器使用udp协议,客户端只能使用的配置文件中这一行只能有一个@
    . @192.168.1.64:514
    服务器使用tcp协议,客户端只能使用的配置文件中这一行必须有两个@@
    . @@192.168.1.64:514

    展开全文
  • VC++创建计划任务的若干方式

    千次阅读 2018-09-30 09:02:06
    文章目录1. 创建计划任务的两种方式1.1 利用CMD... 使用Task Scheduler 1.0 管理计划任务2.1 创建计划任务2.2 枚举计划任务2.3 删除计划任务2.4 触发器结构体 TASK_TRIGGER2.5 创建触发器3. 使用Task Scheduler 2...

    1. 创建计划任务的两种方式

    计划任务是windows操作系统提供的定时执行程序的方式,可在指定时间、指定时机(开机或用户登录)周期性执行指定程序或命令。

    创建计划任务需要管理员权限(过UAC),同时计划任务也将在管理员权限下被执行。

    1.1 利用CMD命令行创建计划任务

    CMD命令行下有两个命令可以创建计划任务,一个是at 另一个是schtasks

    • at 命令仅在Win7及以下系统有效,支持指定任务的执行时间,支持远程创建计划任务,但不能指定任务在系统启动或用户登录时启动。与schtasks命令相比,其优势是创建计划任务所需的命令比较简单。
    • schtasks支持Windows全系列系统,与at命令相比,可设置的选项更加丰富,能适应更多的应用场景,同时还允许指定任务在系统启动、用户登录甚至是系统闲置时间启动。

    1.2 利用COM组件的API编程创建计划任务

    本小节内容来自于 https://docs.microsoft.com/en-us/windows/desktop/TaskSchd/tasks

    : 通过COM组件创建的计划任务会在C:\windows\Tasks目录下生成一个.OBJ格式的文件,且该计划任务无法通过schtasks命令查询。

    1.2.1 几个基本概念

    1. Task对象。一个Task对象就是一个计划任务,Task对象又包括多个组件,具体如下图所示。Task对象至少包含一个Trigger对象和一个Actions对象。
      在这里插入图片描述

    2. Trigger对象定义的是计划任务执行的触发器,详细描述了计划任务的启动时机。

    3. Action对象定义的是计划任务需要执行的具体操作。

    4. Principal定义了执行计划任务需要的安全上下文(Security Context) ,比如指定可执行计划任务的用户。

    5. Setting可以定义计划任务执行时的进程优先级、是否支持一个计划任务有多个实例同时运行等。

    6. Registration Infomation保存的时该计划任务的相关管理信息,例如计划任务的创建者、创建时间等。

    7. Data 计划任务的创建者可以在这里保存计划任务执行所需的额外数据,例如一个XML帮助文档。

    1.2.2 Task API

    windows提供两个版本的API接口用于创建计划任务,分别是Task Scheduler 1.0Task Scheduler 2.0。以下是两套API的区别。

    API 版本系统需求
    Task Scheduler 1.0Windows全系列
    Task Scheduler 2.0Windows Vista 及以上系统

    :Task Scheduler 2.0 允许在远程XP计算机上创建计划任务,但需要将Compatibility属性设置为TASK_COMPATIBILITY_V1。

    2. 使用Task Scheduler 1.0 管理计划任务

    Task Scheduler 1.0 需要使用ITaskScheduler接口,相关示例代码参见:https://docs.microsoft.com/en-us/windows/desktop/TaskSchd/task-scheduler-1-0-examples

    使用Task Scheduler 1.0 的几个注意点:

    1. 必须确保 Task Scheduler service 正在运行。
    2. 当通过接口获取字符串后,必须使用 CoTaskMemFree 进行释放。
    3. 创建和修改计划任务后,必须使用 IPersistFile::Save 对结果进行保存。
    4. 当API使用结束后,需要调用IUnknown::Release 释放所有 IUnknown对象。
    5. 在Task Scheduler 1.0中,每个IScheduledWorkItem类的对象就是一个计划任务;Action直接由IScheduledWorkItem对象的SetApplicationName、和SetParameters函数定义。

    2.1 创建计划任务

    本小节内容来自于:https://docs.microsoft.com/en-us/windows/desktop/TaskSchd/creating-a-task-using-newworkitem-example

    注1:创建计划任务需要管理员权限;

    注2:同时需要为计划任务指定一个唯一的名称,如果指定的名称已被使用,则会导致任务创建失败。

    注3:通过该方式创建的计划任务会在C:\windows\Tasks目录下创建一个同名的JOB文件。

    具体步骤如下:

    1. Call CoInitialize to initialize the COM library and CoCreateInstance to get a Task Scheduler object. (This example assumes that the Task Scheduler service is running.)

    2. Call ITaskScheduler::NewWorkItem to create a new task. (This method returns a pointer to an ITask interface.)

    3. Save the new task to disk by calling IPersistFile::Save. (The IPersistFile interface is a standard COM interface supported by the ITask interface.)

    4. Call ITask::Release to release all resources. (Note that Release is an IUnknown method inherited by ITask.

    示例代码:

    #include <windows.h>
    #include <initguid.h>
    #include <ole2.h>
    #include <mstask.h>
    #include <msterr.h>
    #include <objidl.h>
    #include <wchar.h>
    #include <stdio.h>
    
    
    int main(int argc, char **argv)
    {
      HRESULT hr = S_OK;
      ITaskScheduler *pITS;
      
      
      /
      // Call CoInitialize to initialize the COM library and then 
      // call CoCreateInstance to get the Task Scheduler object. 
      /
      hr = CoInitialize(NULL);
      if (SUCCEEDED(hr))
      {
         hr = CoCreateInstance(CLSID_CTaskScheduler,
                               NULL,
                               CLSCTX_INPROC_SERVER,
                               IID_ITaskScheduler,
                               (void **) &pITS);
         if (FAILED(hr))
         {
            CoUninitialize();
            return 1;
         }
      }
      else
      {
         return 1;
      }
      
      
      /
      // Call ITaskScheduler::NewWorkItem to create new task.
      /
      LPCWSTR pwszTaskName;
      ITask *pITask;
      IPersistFile *pIPersistFile;
      pwszTaskName = L"Test Task";
      
      hr = pITS->NewWorkItem(pwszTaskName,         // Name of task
                             CLSID_CTask,          // Class identifier 
                             IID_ITask,            // Interface identifier
                             (IUnknown**)&pITask); // Address of task 
                                                                                                                                                                                                //  interface
      
      
      pITS->Release();                               // Release object
      if (FAILED(hr))
      {
         CoUninitialize();
         fprintf(stderr, "Failed calling NewWorkItem, error = 0x%x\n",hr);
         return 1;
      }
      
      
      /
      // Call IUnknown::QueryInterface to get a pointer to 
      // IPersistFile and IPersistFile::Save to save 
      // the new task to disk.
      /
      
      hr = pITask->QueryInterface(IID_IPersistFile,
                                  (void **)&pIPersistFile);
      
      pITask->Release();
      if (FAILED(hr))
      {
         CoUninitialize();
         fprintf(stderr, "Failed calling QueryInterface, error = 0x%x\n",hr);
         return 1;
      }
      
      
      hr = pIPersistFile->Save(NULL,
                               TRUE);
      pIPersistFile->Release();
      if (FAILED(hr))
      {
         CoUninitialize();
         fprintf(stderr, "Failed calling Save, error = 0x%x\n",hr);
         return 1;
      }
      
      
      CoUninitialize();
      printf("Created task.\n");
      return 0;
    }

    2.2 枚举计划任务

    具体步骤:

    1. Call CoInitialize to initialize the COM library and CoCreateInstance to get a Task Scheduler object. (This example assumes that the Task Scheduler service is running.)
    2. Call ITaskScheduler::Enum to get an enumeration object.
    3. Call IEnumWorkItems::Next to retrieve the tasks. (This example tries to retrieve five tasks with each call.)
    4. Process the tasks returned. (This example simply prints the name of each task to the screen.
    5. Release resources. Call CoTaskMemFree to free the memory used for names.

    示例代码:

    #include <windows.h>
    #include <initguid.h>
    #include <ole2.h>
    #include <mstask.h>
    #include <msterr.h>
    #include <wchar.h>
    
    #define TASKS_TO_RETRIEVE          5
    
    
    int main(int argc, char **argv)
    {
      HRESULT hr = S_OK;
      ITaskScheduler *pITS;
      
      
      /
      // Call CoInitialize to initialize the COM library and 
      // then call CoCreateInstance to get the Task Scheduler object. 
      /
      hr = CoInitialize(NULL);
      if (SUCCEEDED(hr))
      {
        hr = CoCreateInstance(CLSID_CTaskScheduler,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_ITaskScheduler,
                              (void **) &pITS);
        if (FAILED(hr))
        {
          CoUninitialize();
          return hr;
        }
      }
      else
      {
        return hr;
      }
      
      /
      // Call ITaskScheduler::Enum to get an enumeration object.
      /
      IEnumWorkItems *pIEnum;
      hr = pITS->Enum(&pIEnum);
      pITS->Release();
      if (FAILED(hr))
      {
        CoUninitialize();
        return hr;
      }
      
      /
      // Call IEnumWorkItems::Next to retrieve tasks. Note that 
      // this example tries to retrieve five tasks for each call.
      /
      LPWSTR *lpwszNames;
      DWORD dwFetchedTasks = 0;
      while (SUCCEEDED(pIEnum->Next(TASKS_TO_RETRIEVE,
                                    &lpwszNames,
                                    &dwFetchedTasks))
                      && (dwFetchedTasks != 0))
      {
        ///
        // Process each task. Note that this example prints the 
        // name of each task to the screen.
        //
        while (dwFetchedTasks)
        {
           wprintf(L"%s\n", lpwszNames[--dwFetchedTasks]);
           CoTaskMemFree(lpwszNames[dwFetchedTasks]);
        }
        CoTaskMemFree(lpwszNames);
      }
      
      pIEnum->Release();
      CoUninitialize();
      return S_OK;
    }

    2.3 删除计划任务

    通过调用接口ITaskScheduler::Delete可以删除指定名称的任务。

    2.4 触发器结构体 TASK_TRIGGER

    本小节内容来自于https://docs.microsoft.com/en-us/windows/desktop/TaskSchd/trigger-structures

    Task Scheduler 1.0使用一个结构体来描述触发器,其结构如下图所示。

    在这里插入图片描述

    其中,成员TriggerTypeTASK_TRIGGER_TYPE 的枚举类型,而成员Type则是一个TASK_TRIGGER_UNION 类型的结构体。枚举类型TASK_TRIGGER_TYPE用于指定触发器的类型,而根据TriggerType取值的不同,Type的取值可以是 DAILY, WEEKLY, MONTHLYDATE (day of month), and MONTHLYDOW (day of week) 这几种类型之一,Type用于指定触发器何时被触发。

    如果TriggerType定义的触发器类型为one-time time-based trigger 或 event-based trigger,那么Type的取值将被忽略。

    以下是Type取值与 TRIGGER_TYPE_UNION 所取的结构体类型之间的对应关系图。

    在这里插入图片描述

    2.5 创建触发器

    本小节内容来自于 https://docs.microsoft.com/en-us/windows/desktop/TaskSchd/creating-a-new-trigger

    To create a trigger you must use three interfaces. IScheduledWorkItem provides the IScheduledWorkItem::CreateTrigger method for creating the trigger object, ITaskTrigger provides the ITaskTrigger::SetTrigger method for setting the criteria for the trigger, and the COM interface IPersistFile provides a Save method for saving the new trigger to disk.

    具体步骤如下

    1. Call CoInitialize to initialize the COM library and CoCreateInstance to get a Task Scheduler object. (This example assumes that the Task Scheduler service is running.)
    2. Call ITaskScheduler::Activate to get the ITask interface of the task object. (Note that this example gets the “Test Task” task.)
    3. Call CreateTrigger to create a trigger object. (Note that CreateTrigger is inherited from IScheduledWorkItem.)
    4. Define a TASK_TRIGGER structure. Note that wBeginDay, wBeginMonth, and wBeginYear members of TASK_TRIGGER must be set to a valid day, month, and year respectively.
    5. Call ITaskTrigger::SetTrigger to set the trigger criteria.
    6. Save the task with the new trigger to disk using IPersistFile::Save. (The IPersistFile interface is a standard COM interface supported by the ITask interface.)
    7. Call Release to release all resources. (Note that Release is an IUnknown method inherited by ITask.)

    示例代码如下

    #include <windows.h>
    #include <winbase.h>
    #include <initguid.h>
    #include <ole2.h>
    #include <mstask.h>
    #include <msterr.h>
    #include <wchar.h>
    
    
    int main(int argc, char **argv)
    {
      HRESULT hr = S_OK;
      ITaskScheduler *pITS;
      
      
      ///
      // Call CoInitialize to initialize the COM library and then
      // call CoCreateInstance to get the Task Scheduler object.
      ///
      hr = CoInitialize(NULL);
      if (SUCCEEDED(hr))
      {
        hr = CoCreateInstance(CLSID_CTaskScheduler,
                              NULL,
                              CLSCTX_INPROC_SERVER,
                              IID_ITaskScheduler,
                              (void **) &pITS);
        if (FAILED(hr))
        {
          CoUninitialize();
          return 1;
        }
      }
      else
      {
         return 1;
      }
      
      
      ///
      // Call ITaskScheduler::Activate to get the Task object.
      ///
      
      ITask *pITask;
      LPCWSTR lpcwszTaskName;
      lpcwszTaskName = L"Test Task";
      hr = pITS->Activate(lpcwszTaskName,
                          IID_ITask,
                          (IUnknown**) &pITask);
      pITS->Release();
    
      if (FAILED(hr))
      {
         wprintf(L"Failed calling ITaskScheduler::Activate: ");
         wprintf(L"error = 0x%x\n",hr);
         CoUninitialize();
         return 1;
      }
        
      
      
      ///
      // Call ITask::CreateTrigger to create new trigger.
      ///
      
      ITaskTrigger *pITaskTrigger;
      WORD piNewTrigger;
      hr = pITask->CreateTrigger(&piNewTrigger,
                                 &pITaskTrigger);
      if (FAILED(hr))
      {
        wprintf(L"Failed calling ITask::CreatTrigger: ");
        wprintf(L"error = 0x%x\n",hr);
        pITask->Release();
        CoUninitialize();
        return 1;
      }
      
      
      //
      // Define TASK_TRIGGER structure. Note that wBeginDay,
      // wBeginMonth, and wBeginYear must be set to a valid 
      // day, month, and year respectively.
      //
      
      TASK_TRIGGER pTrigger;
      ZeroMemory(&pTrigger, sizeof (TASK_TRIGGER));
      
      // Add code to set trigger structure?
      pTrigger.wBeginDay =1;                  // Required
      pTrigger.wBeginMonth =1;                // Required
      pTrigger.wBeginYear =1999;              // Required
      pTrigger.cbTriggerSize = sizeof (TASK_TRIGGER); 
      pTrigger.wStartHour = 13;
      pTrigger.TriggerType = TASK_TIME_TRIGGER_DAILY;
      pTrigger.Type.Daily.DaysInterval = 1;
      
      
      ///
      // Call ITaskTrigger::SetTrigger to set trigger criteria.
      ///
      
      hr = pITaskTrigger->SetTrigger (&pTrigger);
      if (FAILED(hr))
      {
        wprintf(L"Failed calling ITaskTrigger::SetTrigger: ");
        wprintf(L"error = 0x%x\n",hr);
        pITask->Release();
        pITaskTrigger->Release();
        CoUninitialize();
        return 1;
      }
      
      
      ///
      // Call IPersistFile::Save to save trigger to disk.
      ///
      
      IPersistFile *pIPersistFile;
      hr = pITask->QueryInterface(IID_IPersistFile,
                                  (void **)&pIPersistFile);
      hr = pIPersistFile->Save(NULL,
                               TRUE);
    
      if (FAILED(hr))
      {
        wprintf(L"Failed calling IPersistFile::Save: ");
        wprintf(L"error = 0x%x\n",hr);
        pITask->Release();
        pITaskTrigger->Release();
        pIPersistFile->Release();
        CoUninitialize();
        return 1;
      }
      
      wprintf(L"The trigger was created and IPersistFile::Save was \n");
      wprintf(L"called to save the new trigger to disk.\n"); 
      
      
      ///
      // Release resources.
      ///
      
      pITask->Release();
      pITaskTrigger->Release();
      pIPersistFile->Release();
      CoUninitialize();
      return 0;
    }

    2.6 立刻执行计划任务、中止计划任务执行

    参见 https://docs.microsoft.com/en-us/windows/desktop/TaskSchd/task-scheduler-1-0-examples

    3. 使用Task Scheduler 2.0 管理计划任务

    Be coming soon.

    展开全文
  • 进程和计划任务管理(详细)

    千次阅读 多人点赞 2020-12-01 02:01:21
    pgrep可用选项 五、查看进程树pstree 六、进程的启动方式 ●手工启动 ●调度启动 ●进程的前后台调度 七、终止进程的运行 ●ctrl、kill、killall ●pkill 八、计划任务管理at 九、计划任务管理crontab(重点) 1、...

    一、程序和进程的关系

    ●程序
    保存在硬盘、光盘等介质中的可执行代码和数据
    文件中静态保存的代码

    ●进程
    在CPU及内存中运行的程序代码
    动态执行的代码
    父、子进程
    每个程序可以创建一个或多个进程

    二、查看进程信息ps(静态)

    ps命令——查看静态的进程统计信息

    方法一:ps aux

    a:显示终端上的所有进程,包括其他用户的进程
    ●u:表示列出进程的用户
    ●x:显示所有终端的进程

    在这里插入图片描述
    各列的解释:
    (1)USER:进程的用户。

    (2)PID:进程的ID。

    (3)%CPU:进程占用的CPU百分比。

    (4)%MEM:占用内存的百分比。

    (5)VSZ:该进程使用的虚拟内存量(KB)。

    (6)RSS:该进程占用的物理内存量(KB)。

    (7)TTY:启动进程的终端名。不是从终端启动的进程则显示为 ?

    (8)STAT:该行程的状态:
    D:不可中断的休眠状态;R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪 调试状态;Z:僵尸进程,进程已经中止,但是部分程序还在内存当中

    (9)START:该进程被触发启动时间。

    (10)TIME:该进程实际使用CPU运行的时间。

    (11)COMMAND:进程的启动命令。

    方法二:ps -elf

    ●-e:显示系统内的所有进程信息。
    ●-l:使用长格式显示进程信息。
    ●-f:使用完整的格式显示进程信息。
    在这里插入图片描述
    各列的解释:
    (1)F:内核分配给进程的系统标记。

    (2)S:进程的状态。

    (3)UID:启动这些进程的用户。

    (4)PID:进程的进程ID。

    (5)PPID:父进程的进程号(如果该进程是由另一个进程启动的)。

    (6)C:进程生命周期中的CPU利用率。

    (7)PRI:进程的优先级(越大的数字代表越低的优先级)。

    (8)NI:谦让度值用来参与决定优先级。

    (9)ADDR:进程的内存地址。

    (10)SZ:假如进程被换出,所需交换空间的大致大小。

    (11)WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名。

    (12)STIME:进程启动时的系统时间。

    (13)TTY:进程启动时的终端设备。

    (14)TIME:运行进程需要的累计CPU时间。

    (15)CMD:进程的启动命令。

    三、查看进程信息top(动态)

    【1】每行对应的信息

    在这里插入图片描述

    第一行是任务队列信息
    ①16:31:58 : 系统时间
    ②up 2:06 : 系统已运行时长
    ③5 user :当前登录用户数
    ④load average: 0.00, 0.01, 0.05 :系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值

    ●第二行为进程信息
    ①Tasks :总进程数
    ②running :正在运行的进程数
    ③sleeping :休眠的进程数
    ④stopped :中止的进程数
    ⑤zombie :僵死的进程数

    第三行为CPU的信息
    ①us :用户占用
    ②sy :内核占用
    ③ni :优先级调度占用
    ④id :空闲CPU,要了解空闲的 CPU 百分比,主要看%id 部分
    ⑤wa:I/O 等待占用
    ⑥hi :硬件中断占用
    ⑦si :软件中断占用
    ⑧st :虚拟化占用

    第四行为内存的信息
    ①total:总内存空间
    ②free :空闲内存
    ③used:已用内存
    ④buff/cache:物理内存和交换内存的缓冲区总和

    第五行为交换空间的信息
    ①total:总交换空间
    ②free :空闲交换空间
    ③used:已用交换空间
    ④avail Mem:可用物理空间

    【2】进程信息区对应解释

    在这里插入图片描述
    进程信息区各列解释:
    (1)PID:进程id

    (2)USER:进程所有者的用户名

    (3)PR:优先级

    (4)NI:谦让度值。负值表示高优先级,正值表示低优先级

    (5)VIRT:进程使用的虚拟内存总量,单位kb

    (6)RES:进程使用的物理内存大小,单位kb

    (7)SHR:共享内存大小,单位kb

    (8)S:进程状态

    (9)%CPU:上次更新到现在的CPU时间占用百分比

    (10)%MEM:进程使用的物理内存百分比

    (11)TIME+:进程使用的CPU时间总计,单位1/100秒

    (12)COMMAND :命令名/命令行

    【3】top常用命令:

    ①P 键:根据CPU使用百分比大小进行排序
    ②M 键:根据驻留内存大小进行排序
    ③N 键:根据启动时间进行排序
    ④c 键:切换显示命令名称和完整命令行
    ⑤h 键:可以获得 top程序的在线帮助信息
    ⑥k 键:根据提示输入指定进程的 PID 号并按 Enter 键终止对应的进程
    ⑦q 键:退出 top 程序
    ⑧数字1 键:显示CPU个数和状态

    ●tty终端

    Centos 7系统,tty1表示图形界面,tty2-tty6表示文字界面,可以用Ctrl+Alt+F1-F6切换。

    pts说明是用远程工具连接的,比如Xshell。后面的数字代表登陆的时间顺序,越小证明登陆的越早

    四、查看进程信息pgrep

    pgrep命令
    根据特定条件查询进程PID信息

    ● pgrep -l "进程关键字"        #指定查看进程名
    

    例:pgrep -l “进程关键字”
    1、在1centos7-1中输入vim /etc/fstab

    在这里插入图片描述
    2、再复制一个会话,来查看当前centos7-1虚拟机的进程信息
    在这里插入图片描述
    3、进入复制会话2centos7-1中,使用pgrep -l "vim"查询关键字vim的进程
    在这里插入图片描述

    【1】pgrep可用选项

    ● pgrep -l "进程关键字" -U 指定特定用户
    ● pgrep -l "进程关键字" -t 指定终端      使用较少
    

    例:grep -l -U
    1、在1centos7-1中创建一个新用户admin,并给与他密码,让他能够使用,再切换至用户admin,输入vim /etc/fstab

    在这里插入图片描述
    2、我们再进入复制会话中查询这台虚拟机现在的进程,但是这次指定用户,指定admin
    在这里插入图片描述在这里插入图片描述

    五、查看进程树pstree

    ●pstree命令
    以树形结构列出进程信息

    ● pstree -aup  用户名    #以树形结构完整列出对应用户名及进程号
    

    -a:显示完整信息
    -u:列出对应用户名
    -p:列出对应PID号

    在这里插入图片描述
    例:
    1、先在1centos7-1中使用admin用户创建一个文件,并进入编辑
    在这里插入图片描述
    2、再进入复制会话中去以树形结构完整列出用户admin的进程号,进程名称
    在这里插入图片描述

    六、进程的启动方式

    ●手工启动

    ①前台启动:用户输入命令,直接执行程序
    ②后台启动:在命令行尾加入“&”符号

    例:多用于让后台自己去运行,我们无需跟踪它的状态,好了之后进行查询确认无误后使用即可

    1、进行一个实验,使用本地磁盘cdrom内部的文件,要使用磁盘,首先挂载,然后我们人性化统计一下/mnt目录内部空间占用情况,发现4.3G,已经很大了,然后我们,复制/mnt目录包括目录下所有文件到/opt目录中,可以看到因为非常大,需要等待,我们已经无法继续操作了
    在这里插入图片描述
    2、遇到这种情况,有两个解决方法,一是复制会话,再继续操作,二就是让它在后台自己慢慢运行
    在这里插入图片描述
    3、使用静态查询进程状态配合管道符号筛选进程号,来看该进程状态
    在这里插入图片描述

    ●调度启动

    ①使用at命令,设置一次性计划任务
    ②使用crontab命令,设置周期性计划任务

    ●进程的前后台调度

    ①Ctrl+z组合键
    将当前程序挂起,即调入后台并停止执行

    在这里插入图片描述

    ②jobs命令
    jobs 【-l】
    查看处于后台的任务列表

    在这里插入图片描述

    ③fg命令
    将后台进程恢复到前台运行,可指定任务序号

    在这里插入图片描述

    七、终止进程的运行

    ●ctrl c、kill、killall

    ●ctrl+c组合键
    ①中断正在执行的命令

    ●kill、killall命令
    ① kill用于终止指定PID号的进程
    ② killall用于终止指定名称相关的所有进程
    ③-9选项用于强制终止

    kill -9 2010和kill -9 2028在下图中就不示范了,很简单,kill -9 + 进程号
    在这里插入图片描述

    ●pkill

    根据特定条件终止相应的进程

    ●常用命令选项
    ①-U:根据进程所属的用户名终止相应进程
    ② -t:根据进程所在的终端终止相应程序

    1、首先在1centos7-1上切换到用户lisi
    在这里插入图片描述
    2、再在复制会话中将lisi用户的进程杀掉,导致bash进程被杀掉,shell解释器也没有了
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    八、计划任务管理at

    ●at命令
    一次性计划任务

    at 【HH:MM】【yyyy-mm-dd】
    

    在这里插入图片描述
    命令格式

    [root@localhost~]#at 21:30      #不跟年月日,表示使用当前日期
    at> shutdown -h now
    ctrl d                          #提交一次性计划任务
    at> <EOT>
    job 2 at Sun May 7 21:30:00 2017
    
    [root@localhost~]# atq          #查看未执行的任务列表
    [root@localhost~]# atrm 1       #删除第一条任务
    

    在这里插入图片描述在这里插入图片描述

    九、计划任务管理crontab(重点)

    crontab命令

    按照预先设置的时间周期(分、时、日、月、周)重复执行用户指定的命令操作

    ●属于周期性计划任务

    ●主要设置文件
    全局配置文件,位于文件:/etc/crontab
    系统默认的设置,位于目录:/etc/cron.*/
    用户定义的设置,位于文件:/var/spool/cron/用户名

    1、管理crontab计划任务

    ●编辑计划任务

    crontab -e 【-u 用户名】      -u缺省时默认当前用户
    

    ●查看计划任务

    crontab -l 【-u 用户名】
    

    ●删除计划任务

    crontab -r 【-u 用户名】
    

    2、crontab任务配置的格式

    代表意义分钟小时日期月份命令
    数字范围0~590~231~311~120~7需要执行的命令

    周的数字为 0 或 7 时,都代表“星期天”的意思。

    3、时间数值的特殊表示方法

    *表示该范围内的任意时间
    ,表示间隔的多个不连续时间点
    -表示一个连续的时间范围
    /表示间隔的时间频率

    应用示例

    0 17 * * 1-5         周一到周五每天17点
    30 8 * * 1,3,5       周一,周三,周五8.30
    0 8-18/2 * * *       8点到18点每两小时
    0 * */3 * *          每三天
    

    crontab -e [-u root] 编辑一个计划任务
    1.每分钟定时执行一次规则:

    每1分钟执行: */1 * * * *或者* * * * *
    每5分钟执行: */5 * * * *
    

    2.每小时定时执行一次规则:

    每小时执行: 0 * * * *或者0 */1 * * *
    每天上午7点执行:0 7 * * *
    每天上午7点10分执行:10 7 * * *
    

    3.每天定时执行一次规则:

    每天执行 0 0 * * *
    

    4.每周定时执行一次规则:

    每周执行 0 0 * * 0
    

    5.每月定时执行一次规则:

    每月执行 0 0 1 * *
    

    6.每年定时执行一次规则:

    每年执行 0 0 1 1 *
    

    其他例子

    5 * * * * ls         指定每小时的第5分钟执行一次ls命令
    30 5 * * * ls        指定每天的 5:30 执行ls命令
    30 7 8 * * ls        指定每月8号的7:30分执行ls命令
    30 5 8 6 * ls        指定每年的6月8日5:30执行ls命令
    30 6 * * 0 ls        指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
    30 3 10,20 * * ls    每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
    25 8-11 * * * ls     每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
    */15 * * * * ls      每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
    30 6 */10 * * ls     每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]
    

    方法二:
    echo ‘30 7 * * 6 /usr/bin/systemctl httpd restart’ >> /var/spool/cron/root

    展开全文
  • windows计划任务定时任务

    千次阅读 2019-04-15 09:55:38
    windows计划任务相关: C:\Users\Administrator> schtasks /? SCHTASKS /parameter [arguments] 描述: 允许管理员创建、删除、查询、更改、运行和中止本地或远程系统上的计划任 务。 参数列表: /Create 创建...
  • 计划任务详解

    千次阅读 2018-08-20 15:51:00
    计划任务:根据自己的时间计划去执行指令或者执行脚本,让计算机到时间自动运行。 分类: 》 一次性计划任务 at (服务名为atd) 软件名为at 》周期性计划任务分为两种:1、crontab -e ,2、/etc/crontab ==...
  • } } 第二步定义调度 文件修改好以后我们需要在 App\Console\Kernel 类的 schedule 方法中定义所有调度任务 namespace App\Console; use DB; use Illuminate\Console\Scheduling\Schedule; use Illuminate\...
  • Linux 计划任务

    千次阅读 2020-02-28 16:00:58
    计划任务主要是做一些周期性的任务,目前最主要的用途是定期备份数据。 分类 一次性调度执行 at:Schedule one-time tasks with at. 循环调度执行 cron:Schedule recurring jobs with cron. 一次性调度执行 at...
  • 添加计划任务启动特定程序(支持win7)
  • 命令行创建任务计划Windows XP/Server 2003 introduced us to the SchTasks command line tool which usurped the At tool offered in Windows 2000. This tool offers the ability to control every aspect of your...
  • 计划任务服务程序(定时任务)

    千次阅读 2018-05-17 10:39:15
      经验丰富的系统运维工程师可以使得Linux 在无需人为介入的情况下,在指定的时间段自动启用或停止某些服务或命令,从而实现运维的自动化。尽管我们现在已经有了功能彪悍的脚本程序...  计划任务分为一次性计划...
  • 计划任务:创建和管理在指定时间自动执行的任务 注意事项:要使计划任务在指定时间内自动运行,计划任务的服务必须能是开启的。 计划任务分为两类: 1、一次性计划任务 2、周期性计划任务 一次性计划任务 ...
  • 在WindowsXP SP2/SP3下及Windows7(SP1)下经测试可正常运行,源代码在压缩包中。
  • https://www.cnblogs.com/VweiweiyixiaoV/p/6611380.html
  • crontab主要作用: 比如我们每天需要清空日志记录文件,我们可以执行一段...'黑色星期五' 每到了周五就发作,计划任务和它一样的道理,只不过没有破坏性,1、 计划任务,crontab命令选项: -u指定一个用户, -l列出...
  • linux计划任务

    万次阅读 2018-03-01 12:20:27
    Linux定时任务Crontab...另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。一、crond简介crond 是linux下用来周期性的执行某种任务或等待处理某些事...
  • Windows的计划任务

    万次阅读 2018-07-29 13:39:22
    阅读目录  一:什么是Windows的计划任务?  二:如何设置计划任务  三:高级设置计划任务  一:什么是Windows的计划任务?  在日常的工作中,我们都有一些固定的或
  • Linux系统中查看进程和计划任务管理

    千次阅读 2019-09-18 05:50:40
     各位小伙伴们大家好,本次给大家带来的是Linux操作系统中的进程和计划任务的管理,首先大家都知道程序是保存在外部存储介质(如硬盘、光盘)中的可执行机器代码和数据的静态集合,而进程是在CPU及内存中处于动态...
  • 批处理之计划任务at和schtasks

    千次阅读 2019-04-28 21:45:25
    windows有一个任务计划程序,可以打开这个程序,创建定时的任务。...要使用命令行创建计划任务,必须保证计划任务已经在运行。 1. at AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]...
  • 命令操作计划备份 语法 wbadmin enable backup -addtarget: {d61aa1e5-0000-0000-0000-000000000000} -schedule:11:00 -include:E: enable backup 启用备份 -addtarget 备份目标位置的磁盘卷,填写磁盘唯一标识符...
  • 文章目录首先我们了解一下程序和进程的关系:一、查看进程1、查看静态的...crontab周期性任务设置1、crontab的配置文件和目录(1) /etc/crontab 全局配置文件2、/etc/cron.*/ 系统默认设置3、/var/spool/cron/用户名
  • 图文详解和实验——进程和计划任务管理

    千次阅读 多人点赞 2021-02-02 00:35:23
    图文详解和实验——进程和计划任务管理一、查看进程1、程序和进程的关系2、查看进程静态信息:PS①、方法一:ps aux②、方法一:ps -elf③、僵尸进程3、查看进程动态信息:top①进程动态行②、进程信息区③top常用...
  • Linux利用crontab创建计划任务详解

    千次阅读 2017-09-24 18:13:23
    crontab 周期性计划任务 cron是Linux下的定时执行工具,可以在无需人工干预的情况下运行作业。 当需要周期性地重复执行任务时可以使用cron服务;该服务每分钟检查一次,并执行符合条件的任务。 Linux任务调度的...
  • # crontab -l no crontab for root => root账号下没有创建计划任务 案例:编写计划任务 # crontab -e 4、计划任务的编辑 crontab -e进入计划任务编辑文件 打开计划任务编辑文件后,可以在此文件中编写我们自定义的...
  • Linux操作系统之创建计划任务

    千次阅读 2020-08-05 19:10:12
    计划任务作用:计划任务主要是做一些周期性的任务。目前最主要的用途是定期备份数据。 分类: 1、一次性调度执行at 2、循环调度执行 cron 二、一次性调度at 语法格式: at <TIMESPEC> <TIMESPEC&...
  • VC实现的添加系统计划任务

    热门讨论 2010-01-28 22:20:47
    VC实现的添加系统计划任务,十分实用,主要是演示了NetScheduleJobAdd的使用方法
  • 玩转计划任务命令:schtasks

    千次阅读 2018-09-10 17:10:00
    Windows 自带的命令非常非常之多,其中计划任务我们之前没有在Win7之家和Vista之家谈及过,今天顺便整理一下,发给大家。 当然,新手朋友们可以绕过此文,老手朋友们可以根据这个定制自己的计划任务。不过,这个...
  • VMware ESXi主机利用cron设置计划任务

    千次阅读 2019-10-10 21:17:11
    在ESXi主机中,并不支持直接使用cron命令配置计划任务,但是我们可以直接编辑cron文件,该文件在ESXi中的路径是:/var/spool/cron/crontabs/root。 1、首先通过命令vi /var/spool/cron/crontabs/root编辑cron文件,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 438,425
精华内容 175,370
关键字:

计划任务