找到并处理 Docker 容器中的僵尸进程
刚刚登录到我的服务器之后,看到 motd 提示有一个僵尸进程。本来处理僵尸进程很简单,杀掉它的父进程就行了。但是紧接着我发现这个进程是属于一个 Docker 容器的,因为我想要更优雅地处理掉它,就顺藤摸瓜找到了对应的容器并将其重启了。这里就记录下我的排查过程以供参考。
刚刚登录到我的服务器之后,看到 motd 提示有一个僵尸进程。本来处理僵尸进程很简单,杀掉它的父进程就行了。但是紧接着我发现这个进程是属于一个 Docker 容器的,因为我想要更优雅地处理掉它,就顺藤摸瓜找到了对应的容器并将其重启了。这里就记录下我的排查过程以供参考。
最近在试着用 TypeScript 写点东西,在用 catch (error) {}
代码块处理异常的时候,看到了一个很难理解的错误 TS18046: error is of type unknown
。网上一顿冲浪之后,看到了 Kent C. Dodds 的一篇博客 Get a catch block error message with TypeScript。我跟着文章的内容成功解决了这个问题,并且解答了我的疑惑,所以想要翻译出来帮助到更多的人。
以下内容除特别注明外,皆翻译自原文。我亦不对内容做任何的担保,并不对任何可能产生的后果(包括但不限于文件丢失或功能异常)负责。
前些天在 Atlassian 的文档中看到一篇关于管理点文件(即.bashrc
之类以点开头的文件)的文章《Dotfiles: Best way to store in a bare git repository》,感觉很有参考价值,遂决定翻译出来,希望能帮到更多的人。
以下内容除特别注明外,皆翻译自原文。我亦不对内容做任何的担保,并不对任何可能产生的后果(包括但不限于文件丢失)负责。
今天看到一篇推文说 Homebrew 也支持类似 package.json
的方式来管理电脑上安装的应用,感觉这玩意挺实用的,像我上回换电脑还是照着 brew list
的输出再一个个装,有了它的话就可以一键安装了。而且除了 Homebrew 之外,它还可以导出通过 App Store 安装的软件和 VS Code 插件。那么,就小小折腾一下。
最近项目里用到了些 Lock,爬了些文了解到它们是基于 AbstractQueuedSynchronizer
(即 AQS
)实现的。那么,不如趁热打铁,看看里面是怎么工作的。
在前一篇博文 Spring Boot 启动流程分析的调用 beanFactory 的后置处理
小节中提到了 beanFactory 的后置处理。这部分是 Spring IoC 的重点,但是因为内容很长,所以在这里单独开一篇博文来分析。
想来用了这么久的 Spring Boot,但一直没仔细了解它是怎么启动的。那既然想起来了,不如趁热打铁,从它的入口开始,深入看看 Spring Boot 在启动时都做了些什么。
前段时间拿 ConcurrentHashMap
和 Timer
简单整了个带过期功能的缓存,那用都用了,顺便就看看 Timer
这玩意是咋实现的。
关于 Java 的类加载机制,尽管我看过几篇文章,知道个双亲委派模型
,但是从来没钻进源码里看它到底是怎么委派的。
在实现一个双检锁单例的时候,IDEA 提示我要给 INSTANCE
实例加上 volatile
修饰符。当时并不明白为啥,所以选择相信 IDE。但是还是那句话,不能知其然不知其所以然啊,自己写的代码,不能自己心里没底不是。于是乎我一顿网上冲浪,终于整明白了为啥双检单例必须要用 volatile
修饰符。