记录一下今天踩的坑.

同事构建了一个服务后到开发环境, 之后整台服务器就一直抛错, CPU狂飙, 16核的机器负载上到 七八百.
发现问题后, 第一时间将开发环境 superver 服务 stop all.
全部停止后发现 让然存在很多子进程未杀死

 ps -ef |grep -i swoole |awk '{print $2}' |xargs  kill -9

全部swoole 进程杀死后,等待1分钟 , top 检测负载降了下来. 重启服务.

supervisorctl start all

重启后查看 supervisorctl status , 一直存在部分服务重启失败.

嘿嘿, 抛错 fork: retry: No child processes

查看 ulimit -a , max user processes (-u) 4096

很明显 dev1 开发账户控制的进程数超出上限了.

ulimit -u 10000

果然, 执行指令 就ok了, 不在抛错了.

清除登陆系统成功的记录

echo > /var/log/wtmp #此文件默认打开时乱码,可查到ip等信息
last #此时即查不到用户登录信息

清除登陆系统失败的记录

echo > /var/log/btmp    #此文件默认打开时乱码,可查到登陆失败信息
lastb                     #查不到登陆失败信息

清除历史执行命令

history -c # 清空历史之行命令
echo > ./.bash_history # 或者,清空用户目录下的这个文件即可

清楚历史执行命令

vi /root/history #新建记录文件
history -c #清除记录
history -r /root/history.txt #导入记录

example

vi /root/history
history -c
history -r /root/history.txt
history
echo > /var/log/wtmp  
last
echo > /var/log/btmp
lastb
history -c
echo > ./.bash_history
history #查询导入结果

Linux 删除历史记录

引言

在Linux系统中,命令历史记录是一个非常有用的功能,它可以记录用户在终端中执行的命令。然而,有时候我们可能需要删除敏感或不必要的历史记录,以保护隐私或减少存储空间的使用。本文将介绍在Linux系统中删除命令历史记录的方法。

1. 删除单条历史记录

要删除单条历史记录,可以使用以下命令:

history -d <line_number>

其中<line_number>是要删除的历史记录所在的行号。例如,要删除第10条历史记录,可以运行以下命令:

history -d 10

这将从历史记录中删除第10条命令。

2. 清空全部历史记录

要清空全部历史记录,可以使用以下命令:

history -c

这将删除所有的命令历史记录。

3. 配置永久删除历史记录

如果您希望永久删除历史记录,可以通过编辑shell配置文件来实现。在大多数Linux系统上,常用的shell配置文件是~/.bashrc(对于Bash shell)或~/.zshrc(对于Zsh shell)。

打开所选的配置文件,并添加以下行:

unset HISTFILE

保存文件并退出。这将禁止将新的命令历史记录保存到文件中,从而实现永久删除历史记录的效果。

注意: 这种方法仅适用于新的命令历史记录。已经存在的历史记录文件需要手动删除。

4. 总结

在Linux系统中,命令历史记录是一个强大而有用的功能。但是,有时候我们需要删除特定的历史记录,或者彻底清空历史记录。通过使用history命令和编辑配置文件,我们可以实现这些目标。

希望本文对您理解如何删除Linux系统中的命令历史记录有所帮助,并帮助您保护个人隐私和管理存储空间。

请注意,上述博客是Markdown格式,您可以将其保存为.md文件,并使用适当的Markdown编辑器进行编辑和格式化。同时,请根据您的实际情况和风格要求进行必要的调整和修改。

引用文献:

请注意,这些文献是关于Bash和Zsh的官方文档,其中包含有关shell命令和配置的详细信息。您可以在这些文档中找到更多关于历史记录管理的信息和指导。

lsof命令是什么?

可以列出被进程所打开的文件的信息。被打开的文件可以是

  1. 普通的文件,
  2. 目录
  3. 网络文件系统的文件,
  4. 字符设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 底层的[socket][1]字流,网络socket,unix域名socket
  9. 在linux里面,大部分的东西都是被当做文件的…..还有其他很多

怎样使用lsof

这里主要用案例的形式来介绍lsof 命令的使用

1. 列出所有打开的文件:

lsof

备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位

2. 查看谁正在使用某个文件

lsof /filepath/file

3. 递归查看某个目录的文件信息

lsof +D /filepath/filepath2/

备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法

lsof | grep ‘/filepath/filepath2/’

5. 列出某个用户打开的文件信息

lsof -u username

备注: -u 选项,u其实是user的缩写

6. 列出某个程序所打开的文件信息

lsof -c mysql

备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了

7. 列出多个程序多打开的文件信息

lsof -c mysql -c apache

8. 列出某个用户以及某个程序所打开的文件信息

lsof -u test -c mysql

9. 列出除了某个用户外的被打开的文件信息

lsof -u ^root

备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

10. 通过某个进程号显示该进行打开的文件

lsof -p 1

11. 列出多个进程号对应的文件信息

lsof -p 123,456,789

12. 列出除了某个进程号,其他进程号所打开的文件信息

lsof -p ^1

13 . 列出所有的网络连接

lsof -i

14. 列出所有tcp 网络连接信息

lsof -i tcp

15. 列出所有udp网络连接信息

lsof -i udp

16. 列出谁在使用某个端口

lsof -i :3306

17. 列出谁在使用某个特定的udp端口

lsof -i udp:55

18. 特定的tcp端口

lsof -i tcp:80

19. 列出某个用户的所有活跃的网络端口

lsof -a -u test -i

20. 列出所有网络文件系统

lsof -N

21.域名socket文件

lsof -u

22. 某个用户组所打开的文件信息

lsof -g 5555

23. 根据文件描述列出对应的文件信息

lsof -d description(like 2)

24. 根据文件描述范围列出文件信息

lsof -d 2-3

原文链接:https://blog.csdn.net/kozazyh/article/details/5495532

早些年,如果你知道有个 strace 命令,就很牛了,而现在大家基本都知道 strace 了,如果你遇到性能问题求助别人,十有八九会建议你用 strace 挂上去看看,不过当你挂上去了,看着满屏翻滚的字符,却十有八九看不出个所以然。本文通过一个简单的案例,向你展示一下在用 strace 诊断问题时的一些套路。

如下真实案例,如有雷同,实属必然!让我们看一台高负载服务器的 top 结果:

photo_2024-03-05 19.19.26.jpeg

技巧:运行 top 时,按「1」打开 CPU 列表,按「shift+p」以 CPU 排序。

在本例中大家很容易发现 CPU 主要是被若干个 PHP 进程占用了,同时 PHP 进程占用的比较多的内存,不过系统内存尚有结余,SWAP 也不严重,这并不是问题主因。

不过在 CPU 列表中能看到 CPU 主要消耗在内核态「sy」,而不是用户态「us」,和我们的经验不符。Linux 操作系统有很多用来跟踪程序行为的工具,内核态的函数调用跟踪用「strace」,用户态的函数调用跟踪用「ltrace」,所以这里我们应该用「strace」:

shell> strace -p <PID>

不过如果直接用 strace 跟踪某个进程的话,那么等待你的往往是满屏翻滚的字符,想从这里看出问题的症结并不是一件容易的事情,好在 strace 可以按操作汇总时间:

shell> strace -cp <PID>

通过「c」选项用来汇总各个操作的总耗时,运行后的结果大概如下图所示:
photo_2024-03-05 19.21.08.jpeg

很明显,我们能看到 CPU 主要被 clone 操作消耗了,还可以单独跟踪一下 clone

shell> strace -T -e clone -p <PID>

通过「T」选项可以获取操作实际消耗的时间,通过「e」选项可以跟踪某个操作:

photo_2024-03-05 19.22.04.jpeg

strace -T -e clone -p

很明显,一个 clone 操作需要几百毫秒,至于 clone 的含义,参考 man 文档:

clone() creates a new process, in a manner similar to fork(2). It is actually a library function layered on top of the underlying clone() system call, hereinafter referred to as sys_clone. A description of sys_clone is given towards the end of this page.

Unlike fork(2), these calls allow the child process to share parts of its execution context with the calling process, such as the memory space, the table of file descriptors, and the table of signal handlers. (Note that on this manual page, “calling process” normally corresponds to “parent process”. But see the description of CLONE_PARENT below.)

简单来说,就是创建一个新进程。那么在 PHP 里什么时候会出现此类系统调用呢?查询业务代码看到了 exec 函数,通过如下命令验证它确实会导致 clone 系统调用:

shell> strace -eclone php -r 'exec("ls");'

最后再考大家一个题:如果我们用 strace 跟踪一个进程,输出结果很少,是不是说明进程很空闲?其实试试 ltrace,可能会发现别有洞天。记住有内核态和用户态之分。

原文作者 : @丁火笔记

karp

创建我自己的巨人