使用Journalctl查询日志 - 2019-05-01 16:32:44

英文原文 How To Use Journalctl to View and Manipulate Systemd Logs | DigitalOcean tldr systemd 有自己的方式处理日志文件, 而不需要依赖任何外部日志系统 systemd 提供统一的日志处理功能, 工具命令 journalctl journald 收集处理所有的内核, 进程产生的日志, 存储使用二进制存储, 可以方便的转换成不同的格式 可以和 syslog 一起使用, 比如 syslog 作为日志中心服 基本 journalctl 命令 查看所有日志 $ journalctl, 类似 less 命令, 老的日志在上面 查看系统本次启动的日志 $ journalctl -b 查看所有的启动日志, 在一台ubuntu 16.04执行命令的结果 $ journalctl --list-boots 0 28eb5f70cb7c481bae3698d85005392e Sat 2018-04-07 22:02:19 UTC—Sun 2018-04-08 17:20:02 UTC 并不是所有的发行版都会保存过去启动的日志 配置 $ sudo nano /etc/systemd/journald.

在heroku上部署Elixir非Phoenix项目 - 2019-05-01 16:32:44

在heroku上创始项目 使用 https://github.com/HashNuke/heroku-buildpack-elixir 这个 Buildpack $ heroku apps:create huobi-bot-ex --buildpack "https://github.com/HashNuke/heroku-buildpack-elixir.git" 配置 Elixir 版本 编辑项目下 elixir_buildpack.config 文件 只有worker,不需要web 设置 web 为0,worker 为 1 $ heroku ps:scale worker=1 -a huobi-bot-ex $ heroku ps:scale web=0 -a huobi-bot-ex Procfile worker: mix run --no-halt

11 Working with components - 2019-04-01 16:32:44

OTP applications 一个OTP application是由多个模块组成的组件,可以依赖于其他application, 这使得可以通过单个函数调用启动整个系统和相关组件 OTP应用程序的组成 一个应用程序定义使用 application resource file (a plain-text file written in Erlang terms )描述 包含的信息 application 名字 版本 描述 有哪些模块 有哪些application依赖 可选的 application-callback 模块 使用 Application 模块启动关闭应用, 底层代码将动态加载此资源文件(显然必须位于加载路径中的某个位置)并启动您的应用程序 启动应用程序相当于启动所有依赖项,然后启动应用程序本身, 通过调用回调模块的 start/2 函数来完成 11.1.1 Creating applications with the mix tool mix 工具帮我们处理这些 创建 项目 mix new hello_world --sup --sup 会创建 application callback 模块 和 空的supervisor iex -S mix 启动项目 Application.started_applications/0 可以查询已经启动的应用 iex(1)> Application.started_applications() [ {:hello_world, 'hello_world', '0.

Linux lsof 命令例子 - 2019-03-04 16:32:44

ls + of 表示 list open files 是一个列出当前系统打开文件的工具 lsof 列出所有打开的文件 不加任何参数列表所有 COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME skynet 3591 deploy cwd DIR 252,0 4096 1836864 /data/deploy/cc_server skynet 3591 deploy rtd DIR 252,0 4096 2 / skynet 3591 deploy txt REG 252,0 3063719 107220195 /usr/lib/skynetx/sx2.0/bin/skynet skynet 3591 deploy mem REG 252,0 40960 107220216 /usr/lib/skynetx/sx2.0/csrc/netpack.so skynet 3591 deploy mem REG 252,0 38136 107220224 /usr/lib/skynetx/sx2.0/csrc/cjson.so skynet 3591 deploy mem REG 252,0 58362 106955562 /usr/lib/skynetx/sx2.

Bash 数组示例 - 2019-02-04 16:32:44

原文 http://www.thegeekstuff.com/2010/06/bash-array-tutorial/ 1 数组声明 像下面 会自动创建 name 数组,不用声明 name[index]=value 例如 $ cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${Unix[1]} $./arraymanip.sh Red hat 通过索引访问元素 ${name[index]} 2 声明时初始化数组 语法 Syntax: declare -a arrayname=(element1 element2 element3) 元素使用空格分隔 #! /bin/bash $cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora'); 3 打印整个数组 如果索引是 @ 或 * 表示整个数组 echo ${Unix[@]} # Add the above echo statement into the arraymanip.

SSH 连接断了但是不想关掉终端重新打开怎么办? - 2017-05-05 20:36:49

SSH 连接断了但是不想关掉终端重新打开怎么办?依次输入 回车 ~ . ~是 SSH 的命令,使用~? 可以看到全部命令,只能在行开始的时候有效 ian@ops:~$ ~? Supported escape sequences: ~. - terminate connection (and any multiplexed sessions) ~B - send a BREAK to the remote system ~C - open a command line ~R - request rekey ~V/v - decrease/increase verbosity (LogLevel) ~^Z - suspend ssh ~# - list forwarded connections ~& - background ssh (when waiting for connections to terminate) ~? - this message ~~ - send the escape character by typing it twice (Note that escapes are only recognized immediately after newline.

start-stop-daemon 将程序作为守护进程启动 - 2017-05-05 20:36:49

像 nohup 这种 太简单,而supervisor这种又有点复杂,需要安装配置 start-stop-daemon 作为系统自带,简单实用 TLDR; 示例 PIDFILE=/var/run/nginx.pid DAEMON=/home/foo/bin/nginx DAEMON_OPTS="-c /tmp/bar/nginx/fake.conf" start-stop-daemon --start --quiet --make-pidfile --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS 上面执行指令通过 start-stop-daemon 来启动一个Nginx进程,并且要求生成一个pid文件到指定目录中。注意这里只是一个虚拟出来的范例,用来说明 start-stop-daemon 的运作方式,真实环境中Nginx不需要这样启动。 参数介绍 –start 启动一个守护进程 –stop 终止一个守护进程 –status 查看一个守护进程运行状态 –pidfile 记录进程号(pid)的文件 –exec 启动进程的入口 –user 启动进程的用户 –make-pidfile 如果进程自己不创建pidfile,可以通过该参数指定 –quiet 不输出警告信息 –background 指定为后台运行模式,一般和–background合用 – 空格之后的参数是传给–exec的,如上例就是/home/foo/bin/nginx
 --status 的几个状态说明 0 Program is running. 1 Program is not running and the pid file exists. 3 Program is not running.

使用 parallel 并行执行ruby code - 2017-05-05 20:36:49

parallel gem 需求,游戏项目里需要处理Excel表格,然后转成lua代码 parallel这个gem可以将任务分配到多个cpu提升速度 使用前,Excel表格依次处理 70.02 real 58.75 user 5.06 sys 使用parallel处理后 Parallel.map($build_tasks, in_processes: 4) do |task| eb = ExcelBuild.new eb.load_excel(task[:filename]) eb.instance_eval(&task[:block]) end 时间减少很多 25.59 real 85.48 user 5.35 sys

如何实现命令行进度条 - 2017-05-05 20:36:49

关键点 \r -ne \r 保证从行开始处开始输出 -ne 不输出换行 \n demo: echo -ne '##### (33%)\r' sleep 1 echo -ne '############# (66%)\r' sleep 1 echo -ne '####################### (100%)\r' echo -ne '\n' 参考 http://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script 一些 Golang 项目 mitchellh/ioprogress: Go (golang) package for progress bars around io.Reader/Writers. cheggaaa/pb: Console progress bar for Golang sethgrid/multibar: Display multiple progress bars in Go (golang). mitchellh/cli: A Go library for implementing command-line interfaces.

Lua os.date 笔记 - 2017-05-05 17:32:23

os.date ([format [, time]]) 若设置time参数,则按time指定的时间格式化,否则按当前时间格式化 > os.date() Mon May 16 14:26:32 2016 > os.date("%x", os.time()) 05/16/16 如果format 以 ! 开始, date 会被格式化成协调世界时(Coordinated Universal Time) *t 将返一个带year(4位), month(1-12), day (1–31), hour (0-23), min (0-59), sec (0-61), wday (星期几, 星期天为1), yday (年内天数), isdst (是否为日光节约时间true/false)的表 > print(os.date ("*t")) table: 0x7fc1aaf01200 > print(os.date ("*t").year) 2017 > print(os.date ("*t").hour) 14 > print(os.date ("*t").wday) 3 若没有*t则返回一个按C的strftime函数格式化的字符串 若不带参数,则按当前系统的设置返回格式化的字符串 os.date() <=> os.date(“%c”) format 参考 %a - Abbreviated weekday name (eg.