办法1: 使用ps命令
进程已经活了多长时间了(Age):
1 2 3 |
# ps -o '%c %t %p' -p 31930 COMMAND ELAPSED PID cobblerd 4-07:31:23 31930 |
这里的 %c %t 不太好记,直接man就好了,或者也可以:
1 2 3 |
# ps -o 'comm,etime,pid' -p 31930 COMMAND ELAPSED PID cobblerd 4-07:32:47 31930 |
关于ELAPSED 的格式: [[dd-]hh:]mm:ss
看来,这个格式是不能自定义的(比如: 折合成秒),肉眼看起来还是非常友好的,但是,程序处理起来就不大方便(比如: 比较大小,做减法等),当然,也可以写个脚本自己转换
办法2:
1 2 |
pid=31930 echo $(( ($(awk '{print $22}' /proc/self/stat) - $(awk '{print $22}' /proc/$pid/stat)) / $(getconf CLK_TCK))) |
相关参考:
UPX 是一个可执行文件压缩工具不同于其他的压缩软件,它:
- 只压缩可执行文件
- 压缩后的可执行文件依然是可以直接执行的文件,功能和没压缩的一样
- 不需要额外的解压缩工具,因为压缩可执行文件相当于给可执行文件套了个壳儿,解压缩的功能已经在压缩后的文件里面了
用途:
- 给病毒文件加壳
- 压缩二进制文件,方便下载
- 压缩docker镜像中的可执行文件,提高镜像分发效率
源码:
参考:
每次查找关心的进程都去ps 再 grep显得好麻烦,而且这是一个非常常用的操作,所以,熟练使用pgrep将有效提高工作效率。
如果不看文档直接去pgrep 你关心的东西,可能得不到想要的效果,因为你关心的是进程的参数,而不是进程名,而且只输出pid,似乎也用处不大,所以,你可能非常关心两个选项:
-f: 模拟情况下,只匹配进程名(/proc/$pid/comm),使用-f选项可以匹配整个命令行(/proc/$pid/cmdline);
-a: 默认只输出pid, 使用-a选项可以输出pid 和整个命令行
所以,pgrep的正确姿势为:
1 |
pgrep -af $pattern |
高级用法:
当我们想在 a.sh 中判断a.sh脚本是否已经在执行时,我们可以通过 -o 选项来实现:
1 |
pgrep -of a.sh |
如果得到的pid就是自己,则说明没有已经在运行的a.sh;
按照ppid来查找:
1 |
pgrep -P $pid |
cfdisk is a curses-based program for partitioning any hard disk drive.
stat一个目录时卡死:
(这个错误和十年前遇到的执行du就卡死的问题,如出一辙)
dmesg 错误信息:
这个机器早被下线了,看来是下线时清理的不够好,现在还有一个机器挂载这死去的机器的nfs呢:(3年了)
问题: 如题。
现场情况:
- 我~/.ssh/下有多个秘钥
- 配置了 .ssh/config 文件,不同类型的机器使用不同的秘钥,也有一些机器使用默认的秘钥
问题原因:
- ssh-copy-id 默认使用的秘钥并不是 id_rsa.pub,而是最新修改过的秘钥:
- ssh 命令默认使用的秘钥是 id_rsa.pub
- 所以,ssh-copy-id 和 ssh 默认不同的秘钥时,就会出现上述问题
- 说明:
- ssh-copy-id 时,会提示使用的秘钥是哪个的:
- 可以通过 -i 选项来指定ssh-copy-id来使用哪个秘钥:
- ssh-copy-id 时,会提示使用的秘钥是哪个的:
在配置了ansible的机器上启用了ControlPath配置: (这样效率会高一些)
1 2 3 4 5 6 7 8 |
# cat ~/.ssh/config Host * Compression yes ServerAliveInterval 60 ServerAliveCountMax 5 ControlMaster auto ControlPath ~/.ansible/cp/ansible-ssh-%h-%p-%r ControlPersist 8h |
然而,我还想在这个机器上使用ssh协议的git,这样不用每次都输入密码,然而,我不想使用默认的ssh key,于是在 ~/.ssh/config 中添加如下配置:
1 2 3 |
Host gitlab IdentityFile ~/.ssh/id_rsa.gitlab User git |
问题来了,如果没有Host * 的配置,git是好使的,有了Host * 的配置就不好使了,测试发现,是因为git不喜欢ControlPath, 然而,我google了一大圈,找不到unset掉ControlPath的方法,只好采用如下方式:
1 2 3 4 5 6 7 |
Host *,!gitlab Compression yes ServerAliveInterval 60 ServerAliveCountMax 5 ControlMaster auto ControlPath ~/.ansible/cp/ansible-ssh-%h-%p-%r ControlPersist 8h |
参考:
现象:
自从使用了docker容器,在容器中yum安装的软件就怎么着也man不了,man的时候就提示:
1 |
No manual entry for man |
通过rpm查看软件包中是否包含man文件,确实包含; 使用rpm -V 也检查不到rpm包损坏; 实际上,man文件是不存在的。
原因:
- 我们使用的docker镜像已经被官方精简过了,把所有已安装软件的man页都删除了,这样镜像可以更小
- docker镜像中的/etc/yum.conf 也被刻意处理了一下,里面有个tsflags的选项,配置了nodocs,这样的话,新安装的软件也会被自动剔掉man文件(估计rpm知道man文件是被故意删掉的,所以也不报错)
解决办法:
- /etc/yum.conf 中注释掉:
1tsflags=nodocs - 卸载掉相关软件,重新yum安装
注: 上述情况是把docker容器当虚拟机使用的,并不太在乎镜像的大小
当vsftpd在容器里面,而且容器IP又是host内部的私有IP的情况,client采用passive模式来下载数据能行得通吗? 可以的
- passive模式下,vsftpd需要listen临时端口来传输数据,所以docker创建容器时,不仅要暴露21端口,还要暴露可能listen的临时端口,为了不映射太多端口,可以在vsftpd的配置文件中配置可能的临时端口的范围
- passive模式下,vsftpd需要通过协议内容告知client临时端口及IP地址,然而,容器网卡IP地址显然是不能被client直接访问到的,庆幸的是,vsftpd配置文件中有关于可以告知client的ip地址的配置,该ip地址并不要求本机上必须有的,显然该配置是给类似情况准备的