zoukankan      html  css  js  c++  java
  • linux

    lsof 进程打开文件:

    lsof /tmp/test.txt  打开文件的信息        -c 某个程序打开的文件 (可以多个-c)    -u user  某个用户的打开 (^user   排除user的其他用户打开)    -p 2333,444,99 进程打开   (-p ^233 排除pid 233 )   -g 500  用户组打开

    lsof -i 列出所用网络连接   -i tcp  (udp)   -i :3306     -i tcp:3306       -a -u hadoop -i (hadoop用户所有活跃端口)

    run-parts   执行第一层级目录下可执行的文件

    linux日志定时轮询:logrotate

    cat /etc/logrotate.d/kdc 
    /var/log/krb5kdc.log {
        daily
        rotate 5
        missingok
        notifempty
        sharedscripts
        dateext
        copytruncate
    }


    测试:
    # /usr/sbin/logrotate -f /etc/logrotate.d/kdc // 未到时间或者未到切割条件,强制切割
    # /usr/sbin/logrotate -d -f /etc/logrotate.d/kdc // 输出切割debug信息

    logrotate参数说明

    compress 通过gzip 压缩转储以后的日志
    nocompress 不做gzip压缩处理
    create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody
    nocreate 不建立新的日志文件
    delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
    nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
    missingok 如果日志丢失,不报错继续滚动下一个日志
    ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
    notifempty 当日志文件为空时,不进行轮转
    mail address 把转储的日志文件发送到指定的E-mail 地址
    olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
    noolddir 转储后的日志文件和当前日志文件放在同一个目录下
    sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
    prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
    postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
    daily 指定转储周期为每天
    weekly 指定转储周期为每周
    monthly 指定转储周期为每月
    rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
    dateext 使用当期日期作为命名格式
    dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
    size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
    当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
    size = 5 或 size 5 (>= 5 个字节就转储)
    size = 100k 或 size 100k
    size = 100M 或 size 100M
    如果设置了size,会无视 daily, weekly,monthly 指令,所以size的优先级比较高

    值得注意的一个配置是:copytruncate
    copytruncate 如果没有这个选项的话,操作方式:是将原log日志文件,移动成类似log.1的旧文件, 然后创建一个新的文件。 如果设置了,操作方式:拷贝原日志文件,并且将其变成大小为0的文件。

    区别是如果进程,比如nginx 使用了一个文件写日志,没有copytruncate的话,切割日志时, 把旧日志log->log.1 ,然后创建新日志log。这时候nginx 打开的文件描述符依然时log.1,由没有信号通知nginx 要换日志描述符,所以它会继续向log.1写日志,这样就不符合我们的要求了。 因为我们想切割日志后,nginx 自动会向新的log 文件写日志,而不是旧的log.1文件

    解决方法有两个:

    向上面的nginx 切割日志配置,再postrotate里面写个脚本

    postrotate # 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
      [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    endscript

    这样就是发信号给nginx ,让nginx 关闭旧日志文件描述符,重新打开新的日志文件描述,并写入日志

    使用copytruncate参数,向上面说的,配置了它以后,操作方式是把log 复制一份 成为log.1,然后清空log的内容,使大小为0,那此时log依然时原来的旧log,对进程(nginx)来说,依然打开的是原来的文件描述符,可以继续往里面写日志,而不用发送信号给nginx

    copytruncate这种方式操作的时候, 拷贝和清空之间有一个时间差,可能会丢失部分日志数据。

  • 相关阅读:
    RMI笔记
    java 本地方法(JNI)
    java 的SPI机制
    eclipse中的 Compiler compliance level含义
    初步理解JNDI
    大数据5.1
    大数据4.1
    需要攻破的知识点
    大数据4.2 -- hive数据库
    大数据---单词释义
  • 原文地址:https://www.cnblogs.com/moonypog/p/11096020.html
Copyright © 2011-2022 走看看