db2 中的sleep函数

db2中没有sleep函数,但是可以自定义一个sleep存储过程:

 

关于儿子

10.1之前被医生诊断为线状苔藓的儿子腿上的十多公分长的一片小疙瘩,说是没有特效药,也没有可靠的治疗方法,可能会变多,也可能自己就消退,不治疗也没有影响的,于是开了两管糠酸莫米松乳膏,10元一管,大约用了一周,一管没用完,已经明显消退了。

儿子最近的口头禅是:(跟图图学的)

为什么,谁说的,你怎么知道

儿子最近迷上五子棋了,因为他总是能赢,每天晚上都有和我下几局

kvm根据IP地址查找kvm(虚拟机)进程

由于IP地址不会出现在kvm进程参数中,如果kvm虚拟机的名字(或其他属性)上也不标记IP地址的话,使用者只告知IP地址的时候就不太好查找虚拟机了。

查找办法:

  1. 首先,根据IP地址查找到MAC地址
    1. 查找方法:
      1. 同一网段的其它机器上ping一下虚拟机的IP地址,然后,arp -an查看IP对应的MAC地址
  2. 然后,根据MAC地址去进程中搜索就行了

注意: 这里是机器活着到底情况下的办法,如果机器死了的时候就不能这样了,所以,最好还是把IP地址标记到某个地方

podman 入门

安装

centos官方yum源目前更新至podman-1.4.4,距离最新的1.5并不太远,所以,centos7上直接yum install -y podman就行。

启动

podman search busybox

podman pull docker.io/library/busybox

podman run -it –rm busybox

查看相关进程:

进程分析:

  1. podman进程并没有立即退出
  2. podman进程也不是容器进程(2953)的祖先进程,
  3. conmon(2943)进程才是容器进程的父进程

通过execsnoop了解podman的基本逻辑:

  1. 首先,准备网络环境,通过iptables以及 containernetworking-plugins 实现
  2. 然后,通过conmon来借助runc启动容器进程

通过podman info 了解podman:

  1. 这里显示了buildah的版本号,podman和buildah是什么关系?buildah是制作镜像用的,应该是可以单独使用的,但是使用podman构建镜像的时候并没有调用buildah进程,难道编译到podman进程里面了?(事实却是如此:Podman uses Buildah’s golang API and can be installed independently from Buildah),参考:https://github.com/containers/libpod
    1. 虽然buidah也有run操作,也要容器的概念,但是这些和podman是不同的,buildah的run相当于dockerfile中的RUN,而容器也是一个短暂的状态
  2. conmon:
  3. registries: 允许有多个registry
  4. storage
    1. 存储驱动: overlay,docker已经默认overlay2了,podman为啥还不支持overlay2?
    2. 存储位置:/var/lib/containers/storage

podman远程连接

目前所有发行版并不带有该功能,通过varlink来实现的,原本只listen本地的unix socket,远程连接需要先走ssh通道,话说这个也无可厚非

Rootless

需要使用crun作为运行时,而不是runc,因为需要cgroup v2,runc不支持cgroup v2

https://github.com/containers/libpod/blob/master/docs/tutorials/rootless_tutorial.md

Skopeo

一个管理镜像仓库的工具

容器迁移

虽然可以设置一个检查点,保存到文件后,从另外一个机器上restore后,继续运行,但是,该模式从网络的角度来看,等待时间太长,或者根本就是中断的,而OpenStack中虚拟机的热迁移基本是无感知的;

测试发现,podman的checkpoint功能完成export功能都很难,尚未测试成功; 另外,如果容器中有僵尸进程,基本是export不了的

vim bash function dash

bash中的函数名中可以包含中划线(-)的,由于中划线比下划线敲起来要容易,所以我就喜欢中划线。但是一般来讲,中划线不能作为单词的一部分的,所以,关键字补全的时候就不能很好的补全。

但是,vim中可以让中划线作为关键字的字符,设置方法为:

se lisp

 

参考: https://superuser.com/questions/403516/exclude-dash-from-word-separators-in-vi

或vim 中查看帮助: help ‘iskeyword’

docker 中的异常

关于容器中已经没有了进程,但是容器还是杀不死的情况:

用bash作为初始进程启动了一个容器:

然后,在bash中cat了一个二进制文件:

如此,bash卡死,不能操作了,可能是因为转码没有处理好导致的。

docker top时已经看不到容器中存在任何进程了,但是docker run进程依然存在

docker stop操作也不能停掉容器。

 

原因在于:

就是说,docker run进程向/dev/pts/0 write的时候,阻塞住了,这就和pts有关了

 

解决办法,kill -9 22784

Redis(5.0)集群分析 – JavaBoy的博客 – CSDN博客

https://blog.csdn.net/xj80231314/article/details/88689898

看的想吐的redis集群

  1. 无法做到无感知的添加和删除节点
  2. 官方的cluster模式比简单的客户端hash好不了多少,只是能自动主从替换而已
  3. 从redis每次sync操作都要sync全量数据,还要触发一次master的全量落地(全量落地可能不是每次sync都做吧)
  4. 主从同步是异步的,无法保证主写入后,从就能读出来,不过这个和mysql逻辑上是一致的,但如何实现选择性地读主库呢?
  5. redis集群作为cachce还能接受,最终存储就不太好
  6. 连接redis集群为啥写所有的节点的地址?假如只写一个节点的话,该节点挂掉的时候,客户端就起不来了,如果保证客户端肯定不重启也没有问题

php 之conf.d ini目录修改

php中参考的conf.d 目录是在编译时指定的,不能在运行时修改,如果非要修改,也不是不行,可以直接用sed来修改php这个二进制文件:

如果是签名或者有摘要校验的二进制文件如phar文件,则不能直接使用sed修改

由于学习swoole的时候,需要使用swoole扩展,但是偶尔又想单步调试一些逻辑,不得不使用xdebug扩展,但是swoole扩展和xdebug扩展势不两立,有不能通过参数来切换是否使用xdebug,于是通过此法搞了两个php二进制文件,二者使用不同的conf.d 目录,就可以单独配置扩展了。

但是phpstorm中单个项目不能同时使用两个php解释器,只好在使用时临时切换php解释器了

linux 连接捕获

A进程总是连接B进程listen的1158端口,而且连接到断开的持续时间很短,由于知道1158端口,所以,B进程很容易被找到,现在不知道A进程是哪个,只知道是本机的某进程来连接1158端口的。

如何找到A进程呢?

对于持续时间不太短的连接,我们通常可以使用ss -anp来查看,但是对于持续时间足够短的连接,ss是不太容易抓到的。毕竟,当机器上进程数多的时候,每个连接都扫一遍所有的进程下的fd,会明显感觉很慢的。

所以,一种办法是:

不使用ss的-p选项,只使用ss -an,从结果中拿到感兴趣的端口后,再去/proc/*/fd/* 中找对应的fd,但是,进程的fd中对应的socket的id并不出现在ss的结果中,无法对应起来。

另一种办法:

直接去 /proc/net/tcp 中查找感兴趣的连接,基本逻辑如下:

其中的 :0486 是我们感兴趣的端口号的16进制表示, 23774779 是我们不感兴趣的连接

 

其实,这样也未必能抓到感兴趣的连接,毕竟连接消失的太快。

比较靠谱的办法是:

让B进程休眠,这样,A进程进入的连接不能被及时处理,就不会立即断开,然后使用ss -anp就可以了,除非A进程设置了非常短的超时,那么,可能我们就需要研究一下systemtap了