linux
# tmux 使用tmux # 新建 tmux(session)tmux a # attach,连接到已有的 tmux 会话C-b-d # detachC-b-c # 新建窗口C-b-num # 切换到 num 窗口,从 0 开始exit # 退出当前窗口常用命令
# 实验楼sudo useradd -d /home/lousai -s /usr/bin/zsh lousaisudo usermod -aG sudo lousaisudo tail -f /var/log/mysql/error.logsudo vim /etc/mysql/my.cnf # bind-addresssudo chown -R mysql:mysql /var/run/mysqldsudo service mysql stopsudo mysqld_safe --skill-grant-tablesUPDATE mysql.`user` set `Password`= PASSWORD('shiyanlou') WHERE `User`='root';FLUSH PRIVILEGES;sudo nginx -tsudo cat /var/log/nginx/error.logsudo netstat -anp|grep 80tail -fn xxx # 动态查看文件echo $? # 打印上一条命令执行成功后的状态码,如果用 zsh 或者 fish-shell,都有主题是自动提示的cd - # 在上次目录之间跳转du -sh dir # 查看文件夹大小df -h # 查看磁盘使用情况free -h # 查看内存使用情况# 包管理apt # 现在 Ubuntu 可以用这个啦# 重定向2>&1 &> >& # 标准错误到标准输入1>&2 # 标准输出到标准错误# 压缩、解压zip -9 # 1-9 faster-betterxz -d .tar.xz # 解压 xztar -xvf .tar # 解压 tartar -xzf # .tar.gz .tgztar -xjf # .tar.bz2tar -xZf #. tar.Z# 文档、帮助man -k xxx # 查看相关的# vimC-v # vim 块选择# job controlxxx & # 命令后台运行nohup xxx # 将命令的所有输出输出到当前目录的 nohup.out 文件中jobs -l # 列出当前 回话(session) 中处在后台的命令, 编号从 1 开始C-z + bg # 将正在运行的命令放到后台fg + num # 将后台运行的命令放到前台, num 就是 jobs -l 中的 num , 只有一个后台的任务的时候可以不加# ssh 大家族ssh user@ip -p22 # 默认用户名为当前用户名,默认端口为 22ssh-keygen # 为当前用户生成 ssh 公钥 + 私钥ssh-copy-id user@ip:port # 将当前用户的公钥复制到需要 ssh 的服务器的 ~/.ssh/authorized_keys,之后可以免密登录rsync -avz ip::Module /path/to/ # 使用 ssh 协议进行增量文件传输, 用来替代 scp# /ect/rsync.conf 的例子# 修改全局配置需要重启, 修改局部配置不用(Module), 且局部配置覆盖全局配置uid = 0gid = 0use chroot = yesmax connections = 30pid file=/var/run/rsyncd.pidlog file=/var/log/rsyncd.log[VIS]hosts allow = [ip]path = /path/to/VISread only = nossh : 建立在应用层和传输层之间的安全协议
配置 nginx + fpm: 在每一个 location 下都需要设置 root, 否则将 root 设置在 location 之外
小技巧:
方向键 + tab
!xxx: 执行命令历史中第一个 xxx 开头的命令
C-a/e/w/u/k/y/l/r : 行首 / 行尾 / 删除一个单词 / 删除光标前 / 删除光标后 / 还原 / 清屏 / 搜索之前执行的命令
注意查看 You have new mail in /var/spool/mail/root
supervisord
http://www.liaoxuefeng.com/article/0013738926914703df5e93589a14c19807f0e285194fe84000
进程守护神: 需要在后台一直启动的进程, 如果进程意外退出可以自动重启
apt-get install supervisor# 配置示例[program:app]command=/usr/bin/gunicorn -w 1 wsgiapp:applicationdirectory=/srv/wwwuser=www-datasupervisord: 启动 supervisor 服务supervisorctl start appsupervisorctl stop appsupervisorctl reload # 修改/添加配置文件需要执行这个crontab
慕课网: http://www.imooc.com/view/216
起源
每分钟检查系统状态
每天进行数据统计
每周备份日志crontab 基本组成
crond: 每分钟读取 配置文件
crontab: 修改 配置文件
配置文件: 设置定时任务
- 常见错误
环境变量: 需要判断当前 crontab 任务是否能正确的识别环境变量
需要给 % 加 \
第三(指定天数) 和 第五(指定 星期几) 执行的是 或 操作
2小时运行一次: 要将分钟设置为 0
service crond # crontab 的服务crontab -el/etc/crontab # 全局配置文件, 可以指定用户/var/log/cron # 所有执行的 cron 任务# 基本格式*/10 每101-5 1-51,5 1 和 559 1 1-7 4 * test `date +\%w` -eq 0 && /path/to/xxx # 4月第一个星期天1:59执行0 2 * * * path/to/xxx # 每2小时执行一次# 每30s执行一次* * * * * xxx* * * * * sleep 30s;xxxfish
https://fishshell.com/docs/current/tutorial.html
fish theme: https://segmentfault.com/a/1190000005009146(not need)
fish show git branch name: https://coderwall.com/p/ycvusg/show-git-branch-name-in-fish-shell
安装时看到 fish 依赖 py, 就能知道 fish 为什么这么强大了
配置文件: fish_config
Running Commands: 兼容 bash 等shell的命令执行方式
Getting Help: help/man cmd -> browser/terminal
Syntax Highlighting: 实时检查命令是否正确
Wildcards: 支持缩写 * 递归 匹配
Pipes and Redirections: 使用 ^ 代表 stderr
Autosuggestions: 自动建议, 可以使用 Ctrl-f / -> 来补全
Tab Completions: 更强大的 tab 补全
Variables: 使用 set 设置
Exit Status: 使用 echo $status 替代 $?
Exports (Shell Variables)
Lists: all variables in fish are really lists
Command Substitutions: 使用 (cmd) 来执行命令, 而不是 反引号、$()
Combiners (And, Or, Not): 不支持使用符合来表示逻辑运算
Functions:使用 $argv 替代 $1
Conditionals (If, Else, Switch) / Functions / Loops: 更人性化的写法(参考 py)
Prompt: function fish_prompt 实现
Startup (Where's .bashrc?): ~/.config/fish/config.fish,更好的方式是 autoloading-function、universal-variables
Autoloading Functions: ~/.config/fish/functions/.
Universal Variables:a variable whose value is shared across all instances of fish
set name 'czl' # 设置变量,替代 name=czlecho $nameecho $status # exit status,替代 $?env # 环境变量set -x MyVariable SomeValue # 替代 exportset -e MyVariableset PATH $PATH /usr/local/bin # 使用 lists 记录 PATHset -U fish_user_paths /usr/local/bin $fish_user_paths # 永久生效touch "testing_"(date +%s)".txt" # command subtitution,替代 `date +%s`cp file.txt file.txt.bak; and echo 'back success'; or echo 'back fail' # combinerfunctions # 列出 fish 下定义的函数gdb
如果删除源代码, 就无法显示行号等辅助信息了
gcc -g gdb.c -o gdb.out # -g 支持gdb调试; -o 输出, 默认为 a.outgdb gdb.out # 进入 gdb 调试环境enter # 继续执行上条命令l # 列出源代码, 默认 10 行, 按 l 继续start # 开始单步调试, 默认 main() 第一行p a # 查看 a 变量的值n # 继续到下一行s # 进入子函数bt # 查看函数栈f 1 # 切换函数栈q 退出调试# 测试用代码#include <stdio.h>void change(int a, int b){ int tmp=a; a=b; b=tmp;}void change2(int *a, int *b){ int tmp=*a; *a=*b; *b=tmp;}int main(){ int a=5,b=3; change(a,b); printf("change:\na=%d\nb=%d\n", a,b); change2(&a,&b); printf("change2:\na=%d\nb=%d\n", a,b);}tmux
Linux平台下的多窗口管理工具
http://haoduoshipin.com/v/41 (好视频网, tmux 教程)
前前后后折腾了很久, 在快捷键的地方被坑住了 -> 先按C-b , 然后再按相应的键, 并不是3个键一起按
概念 tmux是一个 serve , 可以使用 tmux 创建多个 session , 每个session 可以创建多个 窗口 , 每个窗口可以创建多个窗格
sessiontmux (new-session -s name) 创建 session , 可以使用后面的带名字的 , 不带名字就是 从 0 开始的 , 执行一次 , 多创建一个C-b + d detach一个sessiontmux a (-t name) attach 一个 session , 不带名字就连接最近 detach的sessiontmux list-session 查看已有的sessiontmux kill-session -t name 杀死一个 sessiontmux kill-serve 干掉一个serve , 那么所有session就都干掉了
窗口C-b + c 创建窗口C-b + 数字 切换到不同窗口exit 干掉这个窗口C-b "/% 上下/左右拆分当前窗口C-b 方向键 , 移动到不同的窗格
快捷键
C-b ? 来查看所有快捷键 , 请参照教程进行更多配置文件的设置, 下面将C-b 改为 C-a (因为默认是 C-b , 我在好几个服务器上面运行tmux , 就懒得改了 , 用着用着也就习惯了)
unbind C-bset -g prefix C-a同步
2个不同的人连接到同一个tmux , 实时同步2人的操作, 这样一个人就可以给另外一个人演示代码了
bug
不能在tmux中使用sz/rz命令