Mac Launchd 介绍和使用

Mac Launchd 介绍和使用 Linux 上如果想开机开机启动一个服务或者定时运行一个服务有很多的选择比如之前介绍过的Systemd或者用 crontab 也可以,而在 Mac 不同它有一个类似的叫 Launchd 的系统,对应使用launchctl命令控制 Daemons and Agents Launchd 管理 Daemons 和 Agents 两种类型分别存放在不同的文件夹下,主要的区别是 Agents 是用户登录后执行的 Daemons 是开机后就执行,可以通过UserName指定用户比如root用户 配置文件 Launchd 配置文件以.plist结尾,本质上是xml格式的文件,Daemons 和 Agents 各存放的路径也不同 类型 路径 说明 User Agents ~/Library/LaunchAgents 用户 Agents 当前用户登录时运行 Global Agents /Library/LaunchAgents 全局 Agents 任何用户登录时都会运行 System Agents /System/Library/LaunchAgents 系统 Agents 任何用户登录时都会运行 Global Daemons /Library/LaunchDaemons 全局 Daemons 内核初始化加载完后就运行 System Daemons /System/Library/LaunchDaemons 系统 Daemons 内核初始化加载完后就运行 系统运行开机首先会加载内核启动kernel_tas(0),然后启动launchd(1)好后去启动指定好的 Daemons 最后用户登录再运行相应的 Agents 任务 一般文件名都以com.domain.programName.plist格式命名,不管是 Daemons 还是 Agents 格式都是一样的,只是存放位置不同。看下面一个 hello world 的例子 ~/Library/LaunchAgents/com.example.hello.plist ...

April 19, 2021 · 2 min · 334 words · Fython

Go 中的 Arrays 和 Slices

Golang 中的 Arrays 和 Slices 在 go 语言中,我们经常使用Slices类型因为它的方便和灵活,它和另一个Arrays类型有着密切的关系,Slices 是建立在 Arrays 的基础上的,搞明白它们的原理能使我们更加的轻松的使用它们 Arrays Arrays 和别的语言(C、Java)的类型一样,有固定的长度,在内存里是一块连续的空间,用以存储相同类型的 types。用如下方式申明 var array [5]int 像[size]T在 go 中申明array,size 是 type 的一部分 如上面的[5]int代表 5 个 int 元素的 Arrays,和另一个如[10]int是不同的类型,Arrays 有确定的长度。并且申明之后带默认值(各类型的零值)。也可以使用[...]符号省略 size 申明,编译器自动计算 如array := [...]int{1, 2, 3, 4, 5} 变量array引用的是整个 Array 而不是 Array 的第一个元素,如果将一个数组另外赋值是将这个数组拷贝了一份,数组作为函数参数也是将整个数组拷贝一份,非引用数组的指针 Slices 就是因为 Arrays 比较难用,go 在此基础上建立了 Slices,它是可以动态调整长度(dynamically-sized)的描述 Arrays 一部分的 types,Slices 可以使用切片数组的方式得到 array := [5]int{1, 2, 3, 4, 5} // Arrays var slice = array[1:4] // same as `var slice []int = array[1:4]` fmt.Println(slice) // [2 3 4] fmt.Println(len(slice)) // 3 fmt.Println(cap(slice)) // 4 array[2] = 9 fmt.Println(slice) // [2 9 4] slice = slice[:4] fmt.Println(slice) // [2 9 4 5] fmt.Println(array) // [1 2 9 4 5] Slices 的底层指向的是 Arrays,它描述底层一部分的 Arrays,如果被引用的 array 变化了,引用它的所有 slice 都会随之变化 Slices 有长度(length)和容量(capacity),分别通过len和cap获取,长度就是切片的长度,容量是从 slice 的第一个元素到底层引用的 Arrays 的末尾元素的个数,也就是这个 slices 最大能达到的长度,例如上面的 slice 从第二个元素2到引用底层 array 末尾的元素5所以 cap 等于 4,所以 slices 可以动态调整但不能大于它的容量 将整个 Arrays 转化成 Slices 可以忽略前后索引slice := array[:]。Slices 以[]T的形式申明 ...

April 8, 2021 · 3 min · 507 words · Fython

Bash备忘录

BASH SHELL cheat sheet 记录一些 bash shell 脚本的奇技淫巧,都是从实际使用中 google 的。bash 各 Linux 发行版都自带方便好用特别是文本处理、一些运维之类的小脚本,但有些语法繁琐不好记容易忘整理一下方便查找。 trap trap 命令 用于指定在接收到信号后将要采取的动作,常见的用途是在脚本程序被中断时完成清理工作。当 shell 接收到 sigspec 指定的信号时,arg 参数(命令)将会被读取,并被执行。例如: trap "exit 1" HUP INT PIPE QUIT TERM 表示当 shell 收到HUP,INT,PIPE,QUIT,TERM这几个信号时,当前执行的程序会读取参数"exit 1",并将它作为命令执行。 如果要忽略某个信号就参数使用单引号就可以'' trap '' signals 如果启动的时候忽略了信号比如使用了nohup,trap 命令是无效的。具体信号可使用man 7 signal或者kill -l查阅 $*、$@、$# 直接上例子看,如下脚本test.sh echo 参数总个数 \$#: $# echo 第0个参数 \$0: $0 for a in $(seq 1 $#); do eval b=\$$a echo 第"$a"个参数 \$"$a": $b done echo -e "\nUsing \"\$#\":" echo "$#" echo -e "\nUsing \$#:" echo $# echo -e "\nUsing \"\$*\":" for a in "$*"; do echo $a; done echo -e "\nUsing \$*:" for a in $*; do echo $a; done echo -e "\nUsing \"\$@\":" for a in "$@"; do echo $a; done echo -e "\nUsing \$@:" for a in $@; do echo $a; done 然后运行此脚本,注意最后3 4用了双引号 ...

January 20, 2021 · 2 min · 415 words · Fython

使用kubeadm在虚拟机本地搭建Kubernetes集群

使用kubeadm在虚拟机本地搭建Kubernetes集群 本文使用ESXi创建3台ubuntu server 虚拟机搭建一个完整的Kubernetes集群,1台master主节点,2台worker做为工作节点。很多地址都是google的域名,安装下面一些环境可能需要科学上网,创建k8s集群需要如下包 docker – 容器运行环境 kubelet – Kubernets节点代理 kubeadm – 部署多节点Kubernetes集群的工具 kubectl – 用于和Kubernetes交互的命令行工具 会创建如下3台机器 主机名 IP地址 角色 master.k8s 10.0.0.175 主节点 node1.k8s 10.0.0.176 工作节点1 node2.k8s 10.0.0.177 工作节点2 记一下安装时最新的版本号 ubuntu server 20.04.1 kernel version 5.4.0 kubernetes v1.20.0 docker-ce 19.03.14 创建虚拟机配置网址和安装docker 首先在ESXi控制台创建一台ubuntu server虚拟机,配置建议2CPU、2G RAM、20G硬盘,主机名为master.k8s开机更新到最新版本后重启安装docker,切换到root用户,以下所有操作都用root用户 修改主机名 # set hostname hostnamectl set-hostname master.k8s 然后修改/etc/hosts域名解析并添加之后两台的ip地址,如下 10.0.0.175 master.k8s 10.0.0.176 node1.k8s 10.0.0.177 node2.k8s 配置主节点的网络修改/etc/netplan/00-installer-config.yaml如下,我这网卡是ens160 network: version: 2 renderer: networkd ethernets: ens160: # change your's dhcp4: no addresses: [10.0.0.175/24] # change your's gateway4: 10.0.0.1 # change your's nameservers: addresses: [10.0.0.1] # change your's 保存后运行 ...

December 23, 2020 · 3 min · 504 words · Fython

正则表达式中的预查

正则表达式中的预查 有时候使用正则会用到非获取匹配,就是不进行存储供以后使用,也就是正则中的预查,预查分为正向预查(lookahead)和反向预查(lookbehind)。 正向预查 (?=pattern)正向肯定预查(Positive lookahead)。如Python(?=3)匹配Python后跟3的语句,如输入Python3但其中最后的3不算进结果,返回Python (?!pattern)正向否定预查(Negative lookahead)。和上面的类似只是否定的,Python(?!3)匹配后面不带3的句子,输入Python2,也是返回Python 反向预查 (?<=pattern)反向肯定预查(Positive lookbehind)。如(?<=2)Python其实和上面也差不多反向就是向左匹配就是匹配Python前面是2的语句,如输入2Python,返回Python (?<!pattern)反向否定预查(Negative lookbehind)。如(?<!3)Python匹配Python前面不是3的输入,如输入2Python,返回Python 还有一个长的挺像的这里也记录下 (?:pattern) 匹配pattern但不获取匹配结果。 (?:t|b)oy只匹配boy或者toy,和toy|boy一样但更简洁,当然如果使用(t|b)oy就会多一个group

October 27, 2020 · 1 min · 16 words · Fython