清空文件

清空文件 在处理服务器磁盘占用时, 比如有比较大的日志文件, 服务还在运行, 所以文件是不能删的, 又因为文件太大了不适合用文本编辑器打开, 比如 vi 之类, 想清空文件就要用以下方法了. BTW: 删除一个正在使用的文件是另外一个问题… wiloon.com/deleteonwrite truncate truncate -s 0 foo.log truncate 可被用来将一个文件缩小或者扩展到某个给定的大小。 你可以利用它和 -s 参数来特别指定文件的大小。要清空文件的内容, 则在下面的命令中将文件的大小设定为 0 本命令缩减或扩充指定文件的大小为指定值。 参数所指定的文件如果不存在, 那么该命令会创建这个文件。 如果一个文件的大小比参数指定的大, 那么超出的部分就会被丢弃。 如果一个文件比参数指定的小, 那么文件会被扩充, 并且被扩充的部分 (空洞) 在被读取的时候是字节0。 truncate 函数使用前不需要使用 open 函数打开文件 命令格式 truncate 选项 文件列表 命令详解: 对于长选项来说必须的参数, 对于短选项来说也是必须的。 -c, --no-create 不创建任何文件 -o, --io-blocks 把参数指定的大小视为 I/O 块,而不是视为字节 -r, --reference=FILE 使用文件 FILE 的大小作为参考大小 -s, --size=SIZE 使用 SIZE 指定文件的大小 --help display this help and exit 显示这个帮助信息 --version 输出版本信息,然后退出 SIZE 参数可以是 (或者是一个整数后面跟着任意的) 下面的选项: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y. SIZE 之前也可以加上下面的特性: '+' 增加 SIZE, '-' 减少 SIZE, '<'最大为 SIZE, '>'最小为 SIZE, '/'以SIZE为除数,向下取整, '%'以SIZE为除数,向上取整。 注意: -r 和 -s 选项是互斥的。 示例 truncate -c --size 2000m x.dbf # 源文件 test.db 和目标文件 test.db.bak ll -th /root/test.db -rw-r--r--. 1 root root 12G May 24 01:26 /root/test.db [root@my1-222 ~]# ll -th /root/test.db.bak -rw-r--r--. 1 root root 0 May 24 17:51 /root/test.db.bak [root@my1-222 ~]# # 利用truncate瞬间制造大小相同的文件 [root@my1-222 ~]# truncate -r test.db test.db.bak [root@my1-222 ~]# ll -th /root/test.db.bak -rw-r--r--. 1 root root 12G May 24 17:56 /root/test.db.bak [root@my1-222 ~]# [root@my1-222 ~]# truncate --size 10G test.db.bak [root@my1-222 ~]# ll -th /root/test.db.bak -rw-r--r--. 1 root root 10G May 24 18:01 /root/test.db.bak 文件清空之后的 inode 问题 在文件的写入操作比较繁忙的时候会观察到 清空 文件 之后 用 stat 命令查看 inode信息时, 能看到 文件 长度为0 ,但是过几秒再查看时,文件 长度又变成了清空前的长度,但是 df 命令能看到磁盘空间的确被释放了 ...

2017-09-01 · 3 min · 431 words · -

raspberry pi openvpn

raspberry pi openvpn https://community.home-assistant.io/t/how-to-install-openvpn-on-raspberry-pi-with-home-assistant/59002 sudo -s # **rest of the instructions assume you've already done this apt-get update apt-get upgrade apt-get install openvpn unzip easy-rsa gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server/server.conf vim /etc/openvpn/server/server.conf Make the following changes to the server.conf file Increase key security by Finding dh and makesure it reads dh dh2048.pem Allow web traffic pass though to client by uncommenting push “redirect-gateway def1 bypass-dhcp” by removing the semi colon at the start of the line Prevent DNS leak by overriding the default DNS - Uncomment push “dhcp-option DNS 208.67.222.222” and push “dhcp-option DNS 208.67.220.220” Lower OpenVPNs run time auth - Uncomment user nobody and group nogroup Change the port OpenVPN runs on it should current by port 1194 - choose something obscure and above 1024 e.g. port 50000 - leave it as UDP Now save your changes and exit. ...

2017-08-30 · 5 min · 991 words · -

Linux 密码生成工具

Linux 密码生成工具 pwgen -s -y http://blog.csdn.net/u011582658/article/details/38045311 1.pwgen pwgen生成的密码易于记忆且相当安全。从技术上来说,容易记忆的密码不会比随机生成的密码更加安全。但是,在大多数情况下,pwgen生成的密码已经足够安全,除了网银密码等需要高安全等级的情况外。使用易于记忆的密码的好处就是你不会把这些密码写下来或者存到电脑上的某个地方,这样做,本来就是不安全的。 安装pwgen,在终端窗口输入: sudo apt-get install pwgen 不带任何参数运行pwgen,将会输出满屏幕的密码。你可以从中选择一个作为自己的密码然后清除屏幕。采用这种方式生成密码,即使恰好有人在背后,他也不知道你选择的到底是哪一个。 运行pwgen,在终端输入: pwgen 选好密码之后,在终端输入clear清除终端窗口内容。 如果你确定背后没有人,可以使用"-1"来告知pwgen只产生一个密码。 pwgen -1 如果想生成一个完全随机的密码,使用"-s"参数。 pwgen -1 -s 在密码中使用特殊字符 (感叹号,逗号,引号,加号,减号,冒号等) 可以提高密码的安全等级。使用"-y"参数使生成的密码中至少包括一个特殊字符。 pwgen -1 -s -y 更多有趣的参数: -0: 密码中不包含数字。 -B, -ambiguous:密码中不包含容易混淆的字符,比如说'1’和’l’,‘0’和’o’。 -v, -no-vowels:密码不包括元音字母或者可能被误认为是元音字母的数字。这可以防止生成带有攻击性子串的密码。 2.makepasswd makepasswd和pwgen的工作方式类似,但是它生成的密码不容易记忆。所有的密码都是随机生成的,可以看出,makepasswd比pwgen更加注重安全性。 安装makepasswd,在终端输入: sudo apt-get install makepasswd 生成一个密码,输入: makepasswd 生成五个密码,每个密码最少包含10个字符,输入: makepasswd -count 5 -minchars 10 还可以指定以某个字符串为基础生成随机密码。这在生成PIN方面可能很有用。比如说,生成4位PIN,输入: makepasswd -string 1234567890 -chars 4 3.passwordmaker passwordmaker与之前的pwgen和makepasswd不同。它本来是IE,Firefox等浏览器的一个扩展程序。passwordmaker-cli是passwordmaker的命令行版本。安装passwordmaker-cli,输入: sudo apt-get install passwordmaker-cli 在使用passwordmaker的时候,你需要输入一个域名 (URL) 和主密码 (master password) ,passwordmaker会利用这些输入的信息为这个URL生成一个独一无二的密码。 ...

2017-08-30 · 1 min · 80 words · -

向量化

向量化 http://blog.csdn.net/gengshenghong/article/details/7027186 参考手册: http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm 说明: 本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。 更多说明请参考http://blog.csdn.net/gengshenghong/article/details/7034748中补充说明部分。 Summary: Intel编译器提供了自动向量化的功能,能对程序进行一些自动的向量化优化。 (1)什么是向量化 所谓的向量化,简单理解,就是使用高级的向量化SIMD指令 (如SSE、SSE2等) 优化程序,属于数据并行的范畴。 更多理解,参考: http://blog.csdn.net/gengshenghong/article/details/6953942 http://blog.csdn.net/gengshenghong/article/details/7007100 等。 (2)如何对代码进行向量化? 知道了向量化的目标是生成SIMD指令, 那么很显然, 要对代码进行向量化, 第一是依靠编译器来生成这些指令;第二是使用汇编或 Intrinsics 函数。Intel 编译器中, 利用其自动向量分析器 (auto-vectorizer) 对代码进行分析并生成SIMD指令。另外, 也会提供一些 pragmas 等方式使得用户能更好的处理代码来帮助编译器进行向量化。 编译器的自动向量化,简单理解,就是编译器对代码进行一些处理从而生成SIMD指令,一个最常见的可以进行向量化的例子就是for循环,这里简单的理解一下,如下代码片段: #define N 4*10 float a[N], b[N], c[N]; for(int i = 0;i < N; i ++) { a[i] = b[i] + c[i]; } 对于上面的代码,假设float类型是4byte,即32bit。如果使用"传统"的指令,这个for循环至少需要经过40次浮点加法运算。那么,如果使用SSE指令 (128bit暂存器) ,那么一条指令能同事计算4个float,所以,上面的for循环可以只适用10次浮点加法运算就完成了。 说明: 这里只是简单说明一下向量化和SSE等指令集之间的关系,关于SIMD、SSE等的细节参考相关内容 (比如,SSE指令要求内存对齐等,后面向量化也会涉及到这一点) (3)自动向量化的选项和基本使用 基本向量化 /Qvec: 开启自动向量化功能,需要在O2以上使用。在O2以上,这是默认的向量化选项,默认开启的。此选项生成的代码能用于Intel处理器和非Intel处理器。向量化还可能受其他选项影响。由于此选项是默认开启的,所以不需要在命令行增加此选项。 /Qvec-reportn: 输出向量化报告。n取值为0到5. 针对指令集 (处理器) 的向量化 /arch:code: 其中code表示指令集,比如IA32、SSE、SSE2、SSE3、SSSE3等等。后面的指令集一般是前面的指令集的扩展,比如,使用SSE3的时候,那么生成的代码会使用到IA32、SSE、SSE2和SSE3的指令。由于是针对指令集的优化,所以其生成的代码只能运行在支持相应指令集的处理器上。默认的是code使用的是SSE2。 /Qxcode: 其中code也是表示指令集,其取值类似于arch (不完全一样) ,但是/Qx选项生成的代码只能运行在Intel处理器上,它会使用Intel处理器的指令进行更进一步的优化。说明: /arch选择可以运行在兼容这些指令集的非Intel处理器上,/Qx只能运行在Intel处理器上,因为并不是所有的兼容同一指令集的处理器都能兼容所有的指令的。 ...

2017-08-15 · 1 min · 199 words · -

ODX, OTX, UDS

ODX, OTX, UDS https://blog.softing.com/blog/automotive-electronics/diagnostics-odx-otx-uds-and-other-market-standards/ Diagnostics – ODX, OTX, UDS and other market standards Posted on 01/07/2015 by Stephan Obermüller Diagnose_Icon_626_251 A large number of today’s innovations are based on software developments, and vehicles are no exception. Software innovations improve vehicle performance and increase both the safety and sustainability of mobility. The number of ECUs and the associated networking are continually increasing in the process. The associated growing complexity must be mastered over a vehicle’s entire lifetime. In addition to actual control functions, diagnostics is increasingly a focal point in development. Although diagnostics was originally only intended for checking that legal emissions standards were being adhered to, it now takes its place before engineering in the entire value chain. ...

2017-08-14 · 2 min · 346 words · -

uds

uds What is UDS? • UDS stands for Unified Diagnostics Service • It is present in all modern cars • Provides access to the Services offered by ECUs • It takes place on the top of the CAN protocol (Layer 4) • Allows to perform transmissions of up to 256 bytes • It is just a Transport Protocol https://media.defcon.org/DEF%20CON%2024/DEF%20CON%2024%20workshops/DEFCON-24-Workshop-Javier-Vazquez-You-CAN-haz-car-Secretz-UPDATED.pdf

2017-08-14 · 1 min · 59 words · -

tp20 for can bus

tp20 for can bus VW Transport Protocol 2.0 (TP 2.0) for CAN bus CAN allows for data packets with a payload of up to 8 bytes, to send messages longer than 8 bytes it is necessary to use a transport protocol. The OBD-II specification for example makes use of ISO-TP (ISO 15765-2). Volkswagen however uses it’s own transport protocol in its vehicles, known as VW TP 2.0. This page gives a run down on how TP 2.0 works. Please note that there is an older VW TP 1.6 which was used in some vehicles. TP 1.6 is fairly similar but some of the parameters are fixed. Its also worth noting that I have worked all of this out from various presentations and documents that I have found on the net and from logging data. I have not had any access to the official documentation from VW so take any information with a grain of salt. ...

2017-08-14 · 1 min · 173 words · -

flask

flask pip install Flask flask run flask run --host=0.0.0.0 pip install flask-restful https://dormousehole.readthedocs.io/en/latest/ https://flask.palletsprojects.com/en/2.3.x/ https://flask-restful.readthedocs.io/en/latest/quickstart.html

2017-08-14 · 1 min · 15 words · -

CAN, Controller Area Network

CAN, Controller Area Network https://baike.baidu.com/item/CAN%E6%80%BB%E7%BA%BF/297754 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准 (ISO 11898) ,是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议 CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。

2017-08-14 · 1 min · 15 words · -

gnome

gnome Gnome shell system monitor extension https://aur.archlinux.org/packages/gnome-shell-extension-system-monitor-git/ https://github.com/paradoxxxzero/gnome-shell-system-monitor-applet install gnome shell extension https://www.baeldung.com/linux/gnome-shell-extension sudo apt update sudo apt install gnome-shell-extensions After that, we’ll launch the Activities menu, search for Extensions, and open it: chrome install extension: Shell Integration extension refresh page: https://extensions.gnome.org/extension/261/kimpanel/ click on/off button to install gnome shell extenstion

2017-08-12 · 1 min · 50 words · -

supervisor, supervisorctl

supervisor, supervisorctl 常用命令 supervisorctl status supervisorctl stop service0 supervisorctl stop all supervisorctl start all supervisorctl restart all supervisor 配置文件 /etc/supervisord.conf [program:program_0] #程序的启动目录 directory = /home/user_0/projects/ # 启动命令, 跟命令行启动的命令是一样的 command = python foo.py # 在 supervisord 启动的时候也自动启动 autostart = true # 启动 5 秒后没有异常退出, 就当作已经正常启动了, 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启 动成功了 # number of secs prog must stay running (def. 10) # 进程持续运行多久才认为是启动成功 startsecs = 5 # 这个是当我们向子进程发送 stopsignal 信号后,到系统返回信息给 supervisord,所等待的最大时间。 超过这个时间,supervisord 会向该 子进程发送一个强制 kill的信号。 默认为10秒。。非必须设置 stopwaitsecs=10 ; autorestart = true ; 程序异常退出后自动重启 startretries = 3 ; 启动失败自动重试次数,默认是 3 user = leon ; 用哪个用户启动 redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数 ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录 (supervisord 会自动创建日志文件) stdout_logfile = /data/logs/usercenter_stdout.log 使用 supervisor 管理进程 Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程 (不仅仅是 Python 进程) 。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。 ...

2017-08-11 · 4 min · 781 words · -

更新Jar包中的文件

更新Jar包中的文件 http://blackwing.iteye.com/blog/1545670 更新Jar包中的文件 解压 jar xf ***.jar 打包了个fat jar,后来程序作了小修改,如果重新打包一个fat jar再上传服务器实在麻烦,而如果能只把更改的class文件放到原来jar包替换相应文件,则简便很多。 jar命令可以替换jar包对于文件,但需要点小技巧。一般替换 (增加) jar包根目录下的文件,用到的命令是: Java代码 收藏代码 jar uvf myjar.jar ClassToAdd.class 就能把ClassToAdd.class添加到myjar.jar包根目录下。但通常,我们的包都是有多层目录的,这时就需要做点更改。例如,我要更新jar包下: com.blackwing目录下的ClassToAdd.class文件,则命令改为: Java代码 收藏代码 jar uvf myjar.jar com/blackwing/ClassToAdd.class 记得在运行这条命令前,需要在当前文件夹下建立: com/blackwing文件夹,并且把类ClassToAdd.class放到这里,则可以更新jar包中相应目录的类。

2017-08-09 · 1 min · 29 words · -

ansible playbook

ansible playbook ansible playbook 是一个特定格式的 yaml 文件, 不要直接把搜到的 ansible 文档里的 例子直接粘贴到里面, ansible playbook 至少要包含 hosts tasks, ansible 文档里找到的的 task 要粘贴到 tasks 部分 如果出现奇怪的异常, 比如: ‘ansible.builtin.shell’ is not a valid attribute for a Play, 检查 一下 playbook 文件 是不是标准格式 . ansible playbook sample - name: deploy sample hosts: all vars: ansible_ssh_private_key_file: ~/.ssh/id_ed25519 tasks: - name: Pull an image community.docker.docker_image_pull: name: 192.168.50.111:5000/foo-mock:v0.0.1 platform: amd64 ansible_ssh_private_key_file: config ssh private key path ansible-galaxy collection ansible-galaxy collection list ansible-galaxy collection install community.docker # 安装之后才能用 docker - name: Pull an image community.docker.docker_image_pull: name: pacur/centos-7 # Select platform for pulling. If not specified, will pull whatever docker prefers. platform: amd64 end play ...

2017-08-09 · 2 min · 384 words · -

watch command

watch command watch可以周期性的执行一个程序,并显示执行结果。 watch -d netstat -ant watch -n 3 -d netstat -ant 命令参数 -n, -interval, watch 默认每两秒运行一下程序, 可以用 -n 或 -interval 来指定间隔的时间。 -d, -differences 用 -d 或 -differences 选项 watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。 -t, -no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。 -h, -help 查看帮助文档 watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果。你可以拿他来监测你想要的一切命令的结果变化,比如 tail 一个 log 文件,ls 监测某个文件的大小变化,看你的想象力了! 1.命令格式: watch[参数][命令] 2.命令功能: 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令 4.使用实例: 实例1: 命令: 每隔一秒高亮显示网络链接数的变化情况 watch -n 1 -d netstat -ant 说明: 其它操作: 切换终端: Ctrl+x 退出watch: Ctrl+g 实例2: 每隔一秒高亮显示http链接数的变化情况 命令: watch -n 1 -d ‘pstree|grep http’ ...

2017-08-08 · 1 min · 109 words · -

influxdb basic

influxdb basic influxdb v2 install docker compose yaml # compose.yaml services: influxdb2: image: influxdb:2.7.10-alpine ports: - 8086:8086 environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME_FILE: /run/secrets/influxdb2-admin-username DOCKER_INFLUXDB_INIT_PASSWORD_FILE: /run/secrets/influxdb2-admin-password DOCKER_INFLUXDB_INIT_ADMIN_TOKEN_FILE: /run/secrets/influxdb2-admin-token DOCKER_INFLUXDB_INIT_ORG: docs DOCKER_INFLUXDB_INIT_BUCKET: home secrets: - influxdb2-admin-username - influxdb2-admin-password - influxdb2-admin-token volumes: - type: volume source: influxdb2-data target: /var/lib/influxdb2 - type: volume source: influxdb2-config target: /etc/influxdb2 secrets: influxdb2-admin-username: file: ~/.env.influxdb2-admin-username influxdb2-admin-password: file: ~/.env.influxdb2-admin-password influxdb2-admin-token: file: ~/.env.influxdb2-admin-token volumes: influxdb2-data: influxdb2-config: sudo docker compose -f influxdb-compose.yaml up influxdb2 influxdb http api # http api curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "q=show databases" curl -i -XPOST http://localhost:8086/query --data-urlencode "db=mydb" --data-urlencode "q=CREATE DATABASE db0" curl -i -XPOST "http://192.168.97.1:8086/write?db=monitor" --data-binary 'measurement_0,location=us-midwest temperature=82 1594349970000000000' curl -x http://127.0.0.1:8899/ -i -XPOST "http://192.168.97.1:8086/write?db=monitor" --data-binary 'measurement_0,location=us-midwest temperature=86 1594349970000000000' database management #show db show databases # 创建数据库,同时配置retention policy # DURATION: 数据生命周期 30天 # SHARD DURATION: 分片周期 1小时 # NAME: retention policies 名 CREATE DATABASE "database0" WITH DURATION 30d REPLICATION 1 SHARD DURATION 1h NAME "default" # create db # 数据库名不能包含"-", 可以用"_" create database db0 drop database db0 insert -- float value INSERT measurement0,tag0=tag_value0 field0=1,field1=field_value1 -- int value INSERT measurement0,tag0=tag_value0 field0=1i,field1=field_value1 -- with time INSERT measurement0,tag0=tag_value0 field0=1,field1=field_value1 1570611600000000000 delete DELETE FROM measurement0 WHERE tag0=tag_value0 导出 influx -database 'db0' -execute "select field0,\"field1\" from measurement0 where tag-name0='tag-value0' and time>'2018-05-05 02:00:00' and time<'2018-05-07 11:00:00' order by time tz('Etc/GMT-8')" -format 'csv' -precision 'rfc3339' > xxx.csv # 使用 tz('Etc/GMT-8') 后,过滤条件中的time>'xxx' 填写东8区时间. 安装, influxdb install & config dnf sudo tee /etc/yum.repos.d/influxdb.repo<<EOF [influxdb] name = InfluxDB Repository baseurl = https://repos.influxdata.com/rhel/7/x86_64/stable/ enabled = 1 gpgcheck = 1 gpgkey = https://repos.influxdata.com/influxdb.key EOF dnf install influxdb vim /etc/influxdb/influxdb.conf systemctl enable influxdb # install # archlinux yay -S influxdb # centos # https://www.influxdata.com/blog/package-repository-for-linux/ sudo yum install influxdb sudo yum localinstall influxdb-1.2.4.x86_64.rpm # for Linux Binaries (64-bit) tar xvfz influxdb-1.3.1_linux_amd64.tar.gz rsync -r /path/to/influxdb-1.2.4-1/ / #edit config file emacs /etc/influxdb/influxdb.conf /etc/influxdb/influxdb.conf #reporting-disabled = false [meta] dir = "/var/lib/influxdb/influxdb/meta" #retention-autocreate = true [data] dir = "/var/lib/influxdb/influxdb/data" wal-dir = "/var/lib/influxdb/influxdb/wal" wal-fsync-delay = "100ms" # index-version = "inmem" index-version = "tsi1" trace-logging-enabled = false query-log-enabled = true cache-max-memory-size = "512m" cache-snapshot-memory-size = "32m" # 超过10分钟没有写入, 把cache写到新的TSM文件 cache-snapshot-write-cold-duration = "10m" [coordinator] #慢查询 log-queries-after = "10s" [retention] #edit file /etc/default/influxdb STDERR=/data/logs/influxdb/influxdb.log #edit logrotate config, modify log path /etc/logrotate.d/influxdb # chown chown influxdb:influxdb /data/influxdb/ chown influxdb:influxdb /data/logs/influxdb/ #start systemctl start influxdb #or sudo influxd #connect via cli, rfc3339: 日期格式YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ influx -precision rfc3339 docker docker pull influxdb:2.7.10-alpine docker run -d \ --name influxdb \ -p 8086:8086 \ -v "influxdb-data:/var/lib/influxdb2" \ -v "influxdb-config:/etc/influxdb2" \ influxdb:2.7.10-alpine # docker docker run -d \ --name influxdb \ --net net0 \ --ip 192.168.1.xxx \ -p 8086:8086 \ -p 8083:8083 \ -v influxdb-config:/etc/influxdb:ro \ -v influxdb-storage:/var/lib/influxdb \ -v /etc/localtime:/etc/localtime:ro \ influxdb # podman podman run -d \ --name influxdb \ -p 8086:8086 \ -p 8083:8083 \ -p 25826:25826 \ -v influxdb-config:/etc/influxdb:ro \ -v influxdb-storage:/var/lib/influxdb \ -v /etc/localtime:/etc/localtime:ro \ influxdb:1.8.10-alpine # in pod podman run -d \ --name influxdb \ --pod monitor \ -v influxdb-config:/etc/influxdb:ro \ -v influxdb-storage:/var/lib/influxdb \ -v /etc/localtime:/etc/localtime:ro \ influxdb chronograf podman run -d \ --name chronograf \ --pod monitor \ -v chronograf:/var/lib/chronograf \ -v /etc/localtime:/etc/localtime:ro \ chronograf --influxdb-url=http://monitor:8086 run influx sudo podman exec -it influxdb influx sudo podman run -it --rm influxdb influx -host influxdb.wiloon.com retention policies show retention policies show retention policies on db0 CREATE RETENTION POLICY "default" ON db0 DURATION 30d REPLICATION 1 SHARD DURATION 1d DEFAULT # ALTER RETENTION POLICY "<policy name>" ON <database> DURATION <duration> REPLICATION 1 SHARD DURATION <shard group duration> DEFAULT ALTER RETENTION POLICY "default" ON db0 DURATION 3h REPLICATION 1 SHARD DURATION 1h DEFAULT # policy name: retention policy 名: default # database: 库名 # duration 3h: 保留3个小时的数据 # shard group duration 1h: 每1个小时的数据一个分片 # DEFAULT: 设置此策略为默认策略 shard list shard id show shards DROP SHARD <shard_id_number> measurement show measurements DROP MEASUREMENT <measurement_name> DROP MEASUREMENT "kernel" select select * from ping where time > now()-1s select average_response_ms from ping where time > now()-1s and url='192.168.53.8' select "database",id,retentionPolicy,seriesCreate,writeReq from "shard" WHERE time>now()-20s AND "database"='database0' AND retentionPolicy='default' AND writeReq>0 select * from "database0"."rentention-policies-0"."measurement0" sELECT mean(m1) * 10 FROM metric0."default".m0 WHERE time >= now() - 10m AND host='host0' GROUP BY time(10s), host influx influx -execute 'select * from "database0"."retention_policies_0"."measurement0" order by time desc limit 1' # show tag keys SHOW TAG KEYS [ON <database_name>] [FROM_clause] [WHERE <tag_key> <operator> ['<tag_value>' | <regular_expression>]] [LIMIT_clause] [OFFSET_clause] show tag keys show tag keys on db0 from measurements0 show tag values on db0 from measure0 with key="host" SHOW FIELD KEYS [ON <database_name>] [FROM <measurement_name>] show tag values from cpu with key=host where service_name=~/xxx/ influx -precision rfc3339 select * from m0 where tag0='tag-value0' and time > '2018-05-16 13:00:00' and time < '2018-05-16 13:01:00' tz('Etc/GMT-8') #use use db0 drop series from series_name select f0,f1 from s0 where t0=~/xxx.*/ ERR: error parsing query: found /, expected regex at line 1, char 56 # =~和后面的正则表达式之间要有空格T_T select f0,f1 from s0 where t0=~ /xxx.*/ 协议, 整数, 浮点数 浮点数 —— 默认是浮点数,InfluxDB假定收到的所有field value都是浮点数。 以浮点类型存储上面的82: ...

2017-08-02 · 4 min · 819 words · -

时间序列数据库

时间序列数据库 存储大量时间相关的数据(如日志,用户行为等) 创造了一种新型的数据库分类——时间序列数据库(Time Series Database). 时间序列数据库主要用于指处理带时间标签 (按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。 influxdb influxdb是最新的一个时间序列数据库,最新一两年才产生,但已经拥有极高的人气。influxdb 是用Go写的,现在v0.9正在开发中,之前开源出来的最稳定的版本是0.88的,但是0.8X是没有集群方案的,但在0.9中会加入进来。 0.9版本的influxdb对于之前会有很大的改变,后端存储有LevelDB换成了BoltDB,读写的API也是有了很大的变化,也将支持集群化,continuous query,支持retention policy,读写性能也是哇哇的,可以说是时间序列存储的完美方案,但是由于还很年轻,可能还会存在诸多的问题,就像现在正在开发的0.9一样,发布一拖再拖,就是由于还有些技术壁垒没有攻陷。 对于influxdb我不想多说些什么,之后打算开一个专题,专门详细来说一说这个玩意,因为我看国内几乎没有详细的文章来讲influxdb的。 http://www.opscoder.info/tsdb.html 对于时间序列的存储,一般会采用专门的时间序列数据库,而不会去使用MySQL或是mongo(但zabbix就是用的MySQL,所以它在IO上面遇到了瓶颈)。现在时间序列的数据库是有很多的,比如graphite、opentsdb以及新生的influxdb。最近也相继研究了一下这三个数据库,现在把研究所得记录下来。 特性: 高效的时间序列数据写入性能。自定义TSM引擎,快速数据写入和高效数据压缩。 无额外存储依赖。 简单,高性能的HTTP查询和写入API。 以插件方式支持许多不同协议的数据摄入,如:graphite,collectd,和openTSDB SQL-like查询语言,简化查询和聚合操作。 索引Tags,支持快速有效的查询时间序列。 保留策略有效去除过期数据。 连续查询自动计算聚合数据,使频繁查询更有效。 influxDB 不支持数据库的更新操作,毕竟时间数据只能随着时间产生新数据,肯定无法对过去的数据修改。 适合于写多读少的场景 graphite graphite算是一个老牌的时间序列存储解决方案了,graphite由三个部分组成,分别是carbon、whisper和graphite web carbon:实际上是一系列守护进程,这些守护进程用Twisted的事件驱动网络引擎监听时间序列数据。Twisted框架让Carbon守护进程能够以很低的开销处理大量的客户端和流量。 whisper:是一个用于存储时间序列数据的数据库,之后应用程序可以用create,update和fetch操作获取并操作这些数据。 graphite web:使用django开发的一套web,提供一些常用的聚合函数,可以界面友好的展示出图形。再盗图: whisper支持RRD,可以很方便的定义retention,以及定义storage scheme,不需要手动做,graphite会自动帮你按照不同的scheme实现aggregation。这样每个metric的大小就是固定的了,所以理论上可以永久存储数据。graphite的集群方案主要有两种,分别是使用graphite自带的relay或是使用第三方的工具。 当使用自带的relay时,只需要在配置文件中配置要relay到哪些机器即可,这样在数据写入的时候,被写入的节点会relay一份到这些机器中。在读取的时候,在graphite web的settings中配置HOSTS的列表,这样在django的web中会依次从这些HOSTS中读出数据。 另一种是需用第三方的relay工具,Booking公司开源出来了他们所用的用C写得 carbon-c-relay,以及用GO写得carbon-relay-ng。其基本的思想是运用一致性哈希,可以将不同的metric发到不同的机器,以来达到集群的目的,据Booking称他们的graphite集群的规模达到了百台机器,而mertic也达到了百万的级别. 以上的两种方式都会遇到了一个共同的问题,就是集群扩容的问题,我不知道Booking是怎么来解决这个问题的,但是我这边目前是想到了几种方式,这个在我前一篇的文章中已经阐述了: graphite集群扩容方案探究,在这里就先不赘述了。 最后说一下,除了集群问题以外,graphite的还有一性能问题就是读的性能稍差,这决定于其存储的方式,其实在读的时候会去读whisper文件(虽然在django层做了缓存,但是缓存的功能比较弱),通过seek的方式来获取数据的位置,在将数据取出。 opentsdb Opentsdb是一个基于Hbase的时间序列数据库 (新版也支持Cassandra)。 其基于Hbase的分布式列存储特性实现了数据高可用,高性能写的特性。受限于Hbase,存储空间较大,压缩不足。依赖整套 HBase, ZooKeeper 采用无模式的tagset数据结构(sys.cpu.user 1436333416 23 host=web01 user=10001) 结构简单,多value查询不友好 HTTP-DSL查询 opentsdb是一个比较重的时间序列解决方案,为什么说他重呢?因为它的组成是这样的: 可以看到opentsdb所依赖的存储是Hbase集群。TSD在其中担任的责任是IO部分,TSD其实就是一个后台的daemon,一般我会会用一组TSD达成一个TSD的集群 (其实不能算是集群) ,没有master/slave之分,也没有共享状态,然后在之前用LB设备来做负载均衡,官方比较推荐的是用varnish。 当让后端的存储也可以用其他的例如hadoop,但是官方还是建议用Hbase,因为opentsdb就是Hbase社区孵化出来的产品。那么问题来了,Hbase的运维将是一个艰巨的任务,这个依赖于 zookeeper 搭建的集群的坑还是很多的,我看了一下官方文档就有上千页。这里面的优化维护需要有专业的Hbase专家才能完成。 另外opentsdb做不到graphite那样自动做downsample,也就是做不到RRD那样地去存储数据,需要在外面自己做一层手动干这活,再把聚合后的数据写入Hbase,唉,还真是一个费时费力的活。 除此之外opentsdb还是很不错的,读写性能挺高,而且支持tag,支持ttl,支持各种聚合函数。现在很多的监控的metric的存储都是用的opentsdb,嗯,是的,只要有能力玩转还是个不错的选择。 Timescale 基于传统关系型数据库postgresql改造的时间序列数据库 一款兼容sql的时序数据库, 底层存储架构在postgresql上。 作为一个postgresql的扩展提供服务。 ...

2017-08-02 · 1 min · 109 words · -

selinux

selinux 临时关闭 selinux # 查询 selinux 状态 sestatus # 临时关闭selinux setenforce 0 永久关闭 SELinux vim /etc/selinux/config 把 #SELINUX=enforcing 改成 SELINUX=disabled https://www.ibm.com/developerworks/cn/linux/l-secure-linux-ru/index.html http://okeeper.leanote.com/post/CentOS7%E4%B8%AD%E5%85%B3%E9%97%ADselinux https://my.oschina.net/oaoa/blog/185833 SELinux 初探 在进入了 CentOS 5.x 之后,SELinux 已经是个非常完备的核心模块了!CentOS 5.x 提供了很多管理 SELinux 的命令与机制, 因此在整体架构上面比以前的版本要单纯且容易操作管理!所以,在这一版以后,我们建议大家千万不要关掉 SELinux 这玩意儿! 让我们来仔细的玩玩这家伙吧! 小标题的图示什么是 SELinux 什么是 SELinux 呢?其实他是『 Security Enhanced Linux 』的缩写,字面上的意义就是安全强化的 Linux 之意!那么所谓的『安全强化』是强化哪个部分? 是网络资安还是权限管理?底下就让我们来谈谈吧! 当初设计的目标: 避免资源的误用 SELinux 是由美国国家安全局 (NSA) 开发的,当初开发这玩意儿的目的是因为很多企业界发现, 通常系统出现问题的原因大部分都在於『内部员工的资源误用』所导致的,实际由外部发动的攻击反而没有这么严重。 那么什么是『员工资源误用』呢?举例来说,如果有个不是很懂系统的系统管理员为了自己配置的方便,将网页所在目录 /var/www/html/ 的权限配置为 drwxrwxrwx 时,你觉得会有什么事情发生? 现在我们知道所有的系统资源都是透过程序来进行存取的,那么 /var/www/html/ 如果配置为 777 , 代表所有程序均可对该目录存取,万一你真的有启动 WWW 服务器软件,那么该软件所触发的程序将可以写入该目录, 而该程序却是对整个 Internet 提供服务的!只要有心人接触到这支程序,而且该程序刚好又有提供使用者进行写入的功能, 那么外部的人很可能就会对你的系统写入些莫名其妙的东西!那可真是不得了!一个小小的 777 问题可是大大的! ...

2017-08-01 · 11 min · 2290 words · -

lsattr, chattr, 管理文件和目录属性

lsattr, chattr, 管理文件和目录属性 为了允许添加数据,防止更改或者删除等,文件和文件夹可以设定了特定的控制属性。例如, 你可以在关键的系统文件或者文件夹中启用属性, 然后没有任何用户, 包括root, 可以删除或者修改它, 比如不允许使用像 dump 这样的命令等备份工具去备份一个特定的文件或者文件夹,等等。 这些属性只可以在ext2,ext3或者ext4文件系统中的文件和文件夹上设定。 # 使用'i'属性使文件不可更改 chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow # 查看文件属性 lsattr /etc/passwd # ----i----------- /etc/passwd # 移除不可更改属性 chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow lsattr /etc/passwd # ---------------- /etc/passwd 现在试着删除或者修改文件 [root@linuxtechi ~]# rm -f dummy_data rm: cannot remove ‘dummy_data’: Operation not permitted [root@linuxtechi ~]# echo “test” » dummy_data -bash: dummy_data: Permission denied chattr -ai /etc/passed (总结) Linux的chattr与lsattr命令详解 ...

2017-08-01 · 1 min · 160 words · -

fsck

fsck fsck https://man.linuxde.net/fsck/embed#?secret=oLlAnrAniE fsck命令文件系统管理 fsck命令被用于检查并且试图修复文件系统中的错误。当文件系统发生错误四化,可用fsck指令尝试加以修复。 语法 fsck(选项)(参数) 选项 -f 即使文件系统标记为 clean 也强制进行检查 -b superblock 使用替代的超级块 -y 对所有问题都回答 “yes” -a: 自动修复文件系统,不询问任何问题; -A: 依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统; -N: 不执行指令,仅列出实际执行会进行的动作; -P: 当搭配"-A"参数使用时,则会同时检查所有的文件系统; -r: 采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式; -R: 当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查; -s: 依序执行检查作业,而非同时执行; -t<文件系统类型>: 指定要检查的文件系统类型; -T: 执行fsck指令时,不显示标题信息; -V: 显示指令执行过程。 参数 文件系统: 指定要查看信息的文件系统。 实例 linux的文件系统损坏会导致linux不正常关机,出错的时候如果系统告诉你是哪一块硬盘的分区有问题,比如是/dev/hda2,接着用如下的命令去对付它: fsck -y /dev/hda2 结束后使用reboot命令重启系统这样就好了! 如果不知道时哪个地方出了问题,可以直接: fsck 在随后的多个确认对话框中输入:y 结束后同样使用reboot命令重启系统这样就好了! 来自: http://man.linuxde.net/fsck fsck命令文件系统管理 fsck命令被用于检查并且试图修复文件系统中的错误。当文件系统发生错误四化,可用fsck指令尝试加以修复。 来自: http://man.linuxde.net/fsck

2017-08-01 · 1 min · 57 words · -

golang date time, 日期, 时间

golang date time, 日期, 时间 创建一个指定时间的日期对象 start := time.Date(2021, 1, 7, 12, 0, 0, 0, time.Local) 比较 先把当前时间格式化成相同格式的字符串, 然后使用 time 的 Before, After, Equal 方法即可. time1 := "2015-03-20 08:50:29" time2 := "2015-03-21 09:04:25" //先把时间字符串格式化成相同的时间类型 t1, err := time.Parse("2006-01-02 15:04:05", time1) t2, err := time.Parse("2006-01-02 15:04:05", time2) if err == nil && t1.Before(t2) { //处理逻辑 fmt.Println("true") } duration 比较 func minDuration(a, b time.Duration) time.Duration { if a <= b { return a } return b } layout # 时区 2006-01-02T15:04:05Z07:00 2006-01-02T15:04:05Z Mon, 2 Jan 2006 15:04:05 MST 20060102150405.000 # 毫秒 2006-02-01 15:04:05.000 unix nano > time unixnano:=int64(1570603226000000000) t:=time.Unix(0,unixnano) fmt.Println(t) 毫秒, get microsecond, mill second time.Now().UnixNano() / int64(time.Millisecond) func main() { fmt.Printf("时间戳 (秒) : %v;\n", time.Now().Unix()) fmt.Printf("时间戳 (纳秒) : %v;\n",time.Now().UnixNano()) fmt.Printf("时间戳 (毫秒) : %v;\n",time.Now().UnixNano() / 1e6) fmt.Printf("时间戳 (纳秒转换为秒) : %v;\n",time.Now().UnixNano() / 1e9) } days between two dates, 计算时间差 func main() { // The leap year 2016 had 366 days. t1 := Date(2016, 1, 1) t2 := Date(2017, 1, 1) days := t2.Sub(t1).Hours() / 24 fmt.Println(days) // 366 } func Date(year, month, day int) time.Time { return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC) } date > string // 格式化日期 - RFC3339 time.Now().Format("2006-01-02T15:04:05Z07:00") time.Now().Format("2006-01-02-15-04-05") time.Now().Format("2006-01-02 15:04:05") time.Now().Format("2006-1-2 15:4:5") format:="2006-01-02 15:04:05" fmt.Println(time.Now().Format(format)) // 一天前 d, _ := time.ParseDuration("-24h") d1 := now.Add(d) fmt.Println(d1) string > date 在windows下,time.Parse()的时区和time.Format()的时区是一致的。 ...

2017-07-31 · 3 min · 475 words · -