1.如何解决 U盘启动 Lunix 系统死机问题?
2.入门篇:进程等待函数wait详解
3.linux内存分析工具linux内存工具
4.安全干货DockerCVE-2018-6552
5.linux系统管理命令shutdown源码linux系统管理命令
6.剖析std::sort函数设计,源码避免coredump
如何解决 U盘启动 Lunix 系统死机问题?
故障排除 Linux操作系统死机处理方法总结
Linux 有多种机制来保证发生系统崩溃后,分析可以获取有价值的源码信息用以分析问题。确定是分析硬件故障,还是源码应用程序bug 导致的。
Linux 中,分析锋芒顶底图源码有如下几种方法来获取各种崩溃时产生的源码信息。
1.Core dump
Core dump 通常用来调试应用程序错误,分析当某些应用程序运行出现异常崩溃时,源码可以开启系统的分析 core dump 功能,来得到一个程序崩溃时的源码内存信息,用来分析崩溃原因:
在/etc/profile里加上(或者修改)一条:
ulimit -c 0
运行命令:sysctl -w "kernel.core_name_format=/coredump/%n.core"
该命令意思是分析指core文件放在/coredump目录下,文件名是源码进程名+.core
2.Diskdump
diskdump工具提供了在单机上创建和采集vmcore(kernel dump)的能力,而无须使用网络。分析当内核本身出现崩溃的源码时候,当前的内存和CPU状态以及相关的信息都会被保存到一个支持diskdump的磁盘上的保留分区上。在下一次重新启动的时候,当系统重新启动,diskdump的初始化脚本会从保留分区中读取保存的信息并创建一个vcore文件,然后这个文件被再次存放到/var/crash/目录下,文件名为.0.0.1-
如下是一个配置 HP SCSI 设备上启用 diskdump 的过程,如果不是 HP SCSI 设备(即设备名为 /dev/sdX的形式),则无须执行第三、四两个步骤。但需要在第一步前先执行命令: modprobe
diskdump
第一步:编辑 /etc/sysconfig/diskdump文件,将一个空白分区的设备名填入后保存退出,例如:
DEVICE=/dev/cciss/c0d0p2
第二步:初使化 dump 设备
#service diskdump initialformat
警告:该分区的所以数据会丢失。
第三步:使用 cciss_dump 模块替换当前的 cciss 模块:
在 /etc/modprobe.conf 找到如下行:
alias scsi_hostadapter cciss
修改为:
alias scsi_hostadapter cciss_dump
再增加一行:
options cciss_dump dump_drive=1
注:假设diskdump文件中配置的为 /dev/cciss/c0d[#a]p[#b], 请设置为: options cciss_dump dump_drive=[#a]
第四步:重建 initrd 文件:
#mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img.old
#mkinitrd /boot/initrd-`uname -r`.img `uname -r`
第五步:设置 diskdump 服务能够开机自启动:
# chkconfig diskdump on
3.Netdump
如果使用红旗DC4.0 或 3.0 版本系统,是不能支持 diskdump 的,可以利用netdump 来达到输出vmcore 的目的。但是Netdump要求至少有一个服务器以及任意数目的客户端。服务器用来接收客户端死机时的信息,客户端是经常死机的机器。
(一)服务器配置:
(1).检验netdump服务器是否安装完毕:
rpm -q netdump-server
如果未安装,请在光盘 RedFlag/RPMS/ 目录中找到 netdump-server 打头的软件包,执行命令:
rpm -ivh netdump-server-x.x.x.rpm (x为版本号)
进行安装。
(2).服务器包安装后,用命令:
passwd netdump
更改用户的密码.
(3).打开服务:
chkconfig netdump-server on
(4).运行服务器:
service netdump-server start
(二)客户端配置:
(1).校验客户端是否已安装
rpm -q netdump
如果未安装,在光盘 RedFlag/RPMS/ 目录中找到 netdum 打头的软件包,执行命令:
rpm -ivh netdump-x.x.x.rpm (x为版本号)
安装.
(2).编辑文件/etc/sysconfig/netdump,添加如下行:
DEV=eth0
NETDUMPADDR=...
NETDUMPMACADDR=:0C:::F4:E0
...指 netdump 服务器地址。
(3).运行下面的命令,出现提示符时输入密码:
service netdump propagate
(4).打开客户端:
chkconfig netdump on
(5).运行客户端:
service netdump start
(6).测试
为了测试netdump的配置是否正确,在netdump客户机上做下面操作:
cp /usr/share/doc/netdump-xxxxxx/crash.c .
gcc -DKERNEL -DMODULE -I/lib/modules/$(uname -r)/build/include -c crash.c
insmod ./crash.o
这会造成系统崩溃,你会在netdump服务器的/var/crash/<客户端IP>/目录下,看到一个核心转储。当客户机正在转储数据到服务器的时候,你会看到一个名叫“vmcore-incomplete"的文件。当转储结束后,该文件会改名成 "vmcore"。"vmcore"文件的大小会变化,可能达到几个GB.在一个内存是android 测血压 源码M的系统上,上面的测试会产生大约M的vmcore文件。
怎么判断网卡是否支持netdump功能?
内核调试工具netdump需要网卡驱动支持netpoll功能。netpoll的目的是让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包。主要用于网络控制台(net console)和远程内核调试(KGDBoE)中。实现netpoll功能,主要是要实现kernel中的poll_controller函数,该函数定义:void (*poll_controller)(struct net_device *dev)。该函数的作用是在缺少设备中断的情况下,还能对控制器做出响应。几乎所有的poll_controller函数都定义成如下形式:
void my_poll_controller(struct net_device *dev) {
disable_device_interrupt(dev);
call_interrupt_handler(dev->irq, dev);
enable_device_interrupt(dev);
}
所以,poll_controller只是模拟了来自指定设备的中断。一个最简单的判断一个网卡驱动是否这次支持netpoll功能的方法是安装内核源代码,然后在代码树 /usr/src/kernel-<version>中搜索HAVE_POLL_CONTROLLER的定义, grep -r "HAVE_POLL_CONTROLLER" /usr/src/linux-<version>/drivers/net示例如下:
# grep -r "HAVE_POLL_CONTROLLER" /usr/src/linux-2.4/drivers/net
/usr/src/linux-2.4/drivers/net/3cx.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/3cx.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/e/e_main.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/e/e_main.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/e/e_main.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/e/e_main.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/e/e_main.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/eepro.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/eepro.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/pcnet.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/pcnet.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/tg3.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/tg3.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/tlan.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/tlan.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/tulip/tulip_core.c:#ifdef HAVE_POLL_CONTROLLER
/usr/src/linux-2.4/drivers/net/tulip/tulip_core.c:#ifdef HAVE_POLL_CONTROLLER
从输出可以看到,3cx, e, e, eepro, pcnet, tg3, tlan和tulip都支持netpoll。
如果系统使用了这些网卡,那么系统应该支持netpoll,那么就支持netdump。
如果希望进一步确认网卡是否是使用这些网卡,可以查看/etc/modules.conf:
# cat /etc/modules.conf
alias eth1 e
alias eth0 3cx
4.SysRq
SysRq组合键是一组"魔术组合键",只要内核没有被完全锁住,键盘还能够使用,不管内核在做什么事情,使用这些组合键可以立即打印出内核的信息。
使用sysrq组合键是了解系统目前运行情况的最好方式。如果系统出现挂起的情况或者在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,使用sysrq键是一个比较好的方式。
为了安全起见,默认SysRq组合键是关闭的。
打开这个功能,运行:
# echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
# echo 0 > /proc/sys/kernel/sysrq
如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1. 重新启动以后,此功能将会自动打开。
kernel.sysrq = 1
因为打开sysrq键的功能以后,有终端访问权限的用户将会拥有一些特殊的功能。因此,除非是要调试,解决问题,一般情况下,不要打开此功能。如果一定要打开,请确保您的终端访问的安全性。
如何触发一个sysrq事件?
有几种方式可以触发sysrq事件。在带有AT键盘的一般系统上,在终端上输入一下组合键:
Alt+PrintScreen+[CommandKey]
例如,要让内核导出内存信息(CommandKey "m"),ucosii2.52 源码您应该同时按下Alt 和 Print Screen 键,然后按下 m 键. 提示: 此组合键在Xwindows上是无法使用的。所以,您先要切换到文本虚拟终端下。如果您现在是在图形界面,可以按Ctrl+Alt+F1切换到虚拟终端。
当我触发一个sysrq事件的时候,结果保存在什么地方?
当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages.
有时候,可能系统已经无法响应,syslogd可能无法记录此信息。在这种情况下,建议您配置一个串口终端来收集这个信息。
那些类型的sysrq事件可以被触发?
sysrq功能被打开后,有几种sysrq事件可以被触发。不同的内核版本可能会有些不同。但有一些是共用的:
* m - 导出关于内存分配的信息
* t - 导出线程状态信息
* p - 到处当前CPU寄存器信息和标志位的信息
* c - 故意让系统崩溃(在使用netdump或者diskdump的时候有用)
* s - 立即同步所有挂载的文件系统
* u - 立即重新挂载所有的文件系统为只读
* b - 立即重新启动系统
* o - 立即关机(如果机器配置并支持此项功能)
故障分析
虽然我们可以通过上述的几种方法来获取应用程序或操作系统崩溃时的各种信息,但是分析这些问题有一定难度。
常见问题
软件相关
系统平时运行一切正常,自从新实施了一项应用后,频繁发生崩溃现象,此类问题多数与应用程序Bug有关,不一定在所有相同配置系统中都会产生,但是一旦触发该Bug,就有可能发生崩溃。
系统平时运行一切正常,自从新实施了一项应用后,频繁发生崩溃现象,也有一些情况是新增的应用需要做一定的操作系统配置,没有设置的话,也有可能出现资源利用问题,导致崩溃发生。
系统平时运行一切正常,自从新实施了一项应用后,频繁发生崩溃现象,也有一些情况是应用的版本与操作系统版本不匹配,应用软件所需的系统库文件版本不对应,容易引发应用程序崩溃。
系统平时运行正常,近期没有任何新增应用,也没有更改系统配置,却接连发生多次崩溃现象。此类问题多数是压力增大,超出了硬件所能承受的负载,耗尽资源,发生崩溃。
系统平时运行正常,火牛微享 源码近期无新增应用,系统负载也不高,却发生崩溃现象。不排除操作系统本身的问题,有可能某种操作诱发了一个系统Bug,发生崩溃。
硬件相关
新增内存后,系统经常发生崩溃现象,此类问题有可能是位机器配置了超过GB的内存,但没有使用 hugemem 核心导致,具体原因可参见第一节中的说明。
机器使用期限较长,某个硬件发生故障,也会导致系统崩溃的发生。
新配置的机器经常发生崩溃现象,有可能硬件较新,而驱动程序版本较低,一般可通过升级驱动解决,驱动一般集成在内核当中,常见的办法是升级内核版本。
入门篇:进程等待函数wait详解
前言:
编程过程中,有时需要让一个进程等待另一个进程,最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程。这里简单介绍一下系统调用函数:wait()。
文章福利小编推荐自己的Linux内核源码交流群:整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前名可进群领取,并额外赠送一份价值的内核资料包(含视频教程、电子书、实战项目及代码)!
学习直通车: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
进程等待的作用:
进程等待的方法(如何让父进程进行进程等待):wait函数和waitpid函数
函数原型:
作用:进程一旦调用了wait,就会立刻阻塞自己,由wait分析当前进程中的某个子进程是否已经退出了,如果让它找到这样一个已经变成僵尸进程的子进程,wait会收集这个子进程的信息,并将它彻底销毁后返回;如果没有找到这样一个子进程,wait会一直阻塞直到有一个出现。参数statloc用来保存被收集进程退出时的一些状态,它是一个指向int型的指针。但如果对这个子进程是如何死掉的不在乎,咱们可以将它设置为NULL:pid = wait(NULL);如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用会失败,spring4.2.6源码wait返回-1,同时errno会被设置为ECHILD。
运行后:
在第二次打印之前有十秒钟的等待时间,这是我们设置的让子进程睡眠的时间,只有子进程睡眠后醒来,它才能正常退出,也就是能被父进程捕捉到。不管设置多长时间,父进程都会等待下去。
注意:
当父进程忘了用wait()函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸进程. wait()要与fork()配套出现,如果在使用fork()之前调用wait(),wait()的返回值则为-1,正常情况下wait()的返回值为子进程的PID. 如果先终止父进程,子进程将继续正常进行,只是它将由init进程(PID 1)继承,当子进程终止时,init进程捕获这个状态. 参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就像下面这样: pid = wait(NULL); 如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。 如果参数status的值不是NULL,wait就会把子进程退出时的状态取出并存入其中, 这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的,以及正常结束时的返回值,或被哪一个信号结束的等信息。由于这些信息 被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作,下面我们来学习一下其中最常用的两个: 1,WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。 (请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数–指向整数的指针status,而是那个指针所指向的整数,切记不要搞混了。) 2, WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。
代码示例:wait.c
运行结果:
wait函数:pid_t wait (int* status)
在编码时有一个代码规范:
如果是输入型,参数定义成引用;
如果是输出或者输入输出参数,参数定义成指针;
wait函数的四个特性:
1.输出型参数,与其对应的有:
2.int* status是一个指针类型占四个字节,但是实际中只使用到后两个字节,将这两个字节分为三部分:
退出码:程序正常退出时用到
coredump标志位,退出信号是程序异常退出时用到:
用退出信号判断进程是否正常退出:
产生coredump文件不能判断进程是否正常退出的原因:
1.判断是否有退出信号
2.判断coredump标志位
3.判断退出码
使用wait函数阻止子进程变成僵尸进程
运行情况:
阻塞:
阻塞概念:当调用结果返回之前,当前的执行流会被挂起,并在得到结果之后返回
父进程一直在wait,并没有返回;
对阻塞和非阻塞理解:
1.子进程一种在运行;
2.子进程已退出
对于两种非阻塞的情况,父进程都是直接退出,但是两种情况父进程退出后,一种正常一种不正常
waitpid函数
wait函数的实现是调用waitpid函数实现
我爱内核网 - 构建全国最权威的内核技术交流分享论坛
原文地址: 进程等待函数wait详解 - 进程管理 - 我爱内核网(侵删)
精彩推荐:
如何理解Linux内核下的进程切换
玩转腾讯首发Linux内核源码《嵌入式开发笔记》,也许能帮到你哦
简要分析Linux下多进程的同步和互斥
[实战篇]红黑树在Linux内核中的应用
%Linux使用者都不知道的内存问题
linux内存分析工具linux内存工具
linux如何看内存颗粒信息?查看内存信息(显示插槽个数和每个插槽里内存条的大小)
dmidecode-tmemory|grepSize查看内存条厂家dmidecode-tmemory|grepManufacturerfree查看当前内存使用情况
linux下有什么检测内存溢出的工具?
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
可以使用相应的软件测试工具对软件进行检测。
1.ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。
2.Dmalloc-DebugMallocLibrary.
3.Electric
Fence-Linux分发版中由BrucePerens编写的malloc()调试库。
4.Leaky-Linux下检测内存泄漏的程序。
5.LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。
6.MEMWATCH-由Johan
Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。
7.Valgrind-DebuggingandprofilingLinuxprograms,aimingat
programswritteninCandC++.
8.KCachegrind-Avisualizationtoolfortheprofilingdata
generatedbyCachegrindandCalltree.
9.Leak
Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。
.IELeakDetector
(Drip/IESieve)-Drip和IESieveleak
detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。
.WindowsLeaks
Detector-探测任何Win应用程序中的任何资源泄漏(内存,句柄等),基于WinAPI调用钩子。
.SAPMemory
Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查找JAVA程序的内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse
RCP(RichClientPlatform),可以下载RCP的独立版本或者Eclipse的插件。
.DTrace-即动态跟踪Dynamic
Tracing,是一款开源软件,能在Unix类似平台运行,用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。
.IBMRationalPurifyPlus-帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus
将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。
.ParasoftInsure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft
VisualC++的一个插件运行。
.CompuwareDevPartnerforVisualC++BoundsChecker
Suite-为C++开发者设计的运行错误检测和调试工具软件。作为MicrosoftVisualStudio和C++6.0的一个插件运行。
.ElectricSoftwareGlowCode-包括内存泄漏检查,code
profiler,函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。
.CompuwareDevPartnerJava
Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。
.QuestJProbe-分析Java的内存泄漏。
.ej-technologiesJProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码:A-G#F-1olm9mv1i5uuly#
.BEAJRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。
.SciTechSoftwareAB.NETMemory
Profiler-找到内存泄漏并优化内存使用针对C#,VB.Net,或其它.Net程序。
.YourKit.NETJavaProfiler-业界领先的Java和.NET程序性能分析工具。
.AutomatedQAAQTime-AutomatedQA的获奖产品performanceprofiling和memory
debugging工具集的下一代替换产品,支持Microsoft,Borland,Intel,Compaq和
GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net
1.0,1.1,2.0,3.0和Windows/位应用程序。
.JavaScriptMemoryLeakDetector-微软全球产品开发欧洲团队(GlobalProduct
Development-Europeteam,GPDE)
发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。
如何限制linux所有进程可使用的总内存?
下面的shell脚本可以实时的监控系统中各个进程的CPU和内存的占用情况,用于限制进程CPU占用率更加合理。
#!/bin/shPIDS=`top-bn1|grep^*|awk’{ if($9>||$>id-u$2>)print$1}’`forPIDin$PIDSdorenice+$PIDechorenice+$PIDdone能够将这个脚本放到cron中运行,比如每分钟检查一次,只需以root身份添加crontab项:
#crontab-e*****limit.sh以后每个一分钟就会检查一次,调整占用%以上CPU或%内存的进程的nice值,从而使这样的进程优先级变低,被调度的机会减少,同时会向root发邮件提示该进程被调整过。
但是,限制内存使用最好还是用PAM,RedHat能够在/etc/security/limits.conf中配置。
如何让linux生成内存dump?
在Linux上只要打开coredump文件开关,当程序crash时系统生成相应的core文件。下面是简单的一些步骤:
1.查看当前是否已经打开了此开关通过命令:ulimit-c如果输出为0,则代表没有打开。如果为unlimited则已经打开了,就没必要在做打开。
2.通过命令打开ulimit-cunlimited.然后通过步骤1,可以监测是否打开成功。
3.如果你要取消,很简单:ulimit-c0就可以了通过上面的命令修改后,一般都只是对当前会话起作用,当你下次重新登录后,还是要重新输入上面的命令,所以很麻烦。我们可以把通过修改/etc/profile文件来使系统每次自动打开。步骤如下:1.首先打开/etc/profile文件一般都可以在文件中找到这句语句:ulimit-S-c0>/dev/null2>1.ok,根据上面的例子,我们只要把那个0改为unlimited就ok了。然后保存退出。2.通过source/etc/profile使当期设置生效。3.通过ulimit-c查看下是否已经打开。其实不光这个命令可以加入到/etc/profile文件中,一些其他我们需要每次登录都生效的都可以加入到此文件中,因为登录时linux都会加载此文件。比如一些环境变量的设置。还有一种方法可以通过修改/etc/security/limits.conf文件来设置,这个方法没有试过,也是网上看到。不过上面两种就可以了!最后说一下生成coredump文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。coredump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改coredump文件的位置(如希望生成到/tmp/cores目录下)echo“/tmp/cores/core”>/proc/sys/kernel/core_pattern设置完以后我们可以做个测试,写个程序,产生一个异常。然后看到当前目录会有个core*的文件。
Linux释放内存页由什么程序实现?
释放内存页由命令free来实现。
安全干货DockerCVE--
cve--
此漏洞未有公开分析,唯一的参考是长亭在滴滴安全大会的PPT,信息简略,仅在完成利用后发现一些未注意到的细节。漏洞基于条件竞争,主要影响未修复版本的is_same_as函数,通过特殊方法使其不执行正常逻辑,继续往下执行。
源码分析
展示了is_same_as源码,以及修复前后版本的对比。apport源码位于2..9版本,追踪源码找到更改过的pid进入get_pid_info,贴出源码。
apport为ubuntu程序,用于处理程序崩溃信息,配置文件如/sys/kernel/core_pattern影响生成core文件的命名方式。核心是确定生成的core文件路径,以及内核coredump.c传入的参数。
核心配置文件为/sys/kernel/core_uses_pid,值为1代表生成的core文件带.pid,0代表不带。同时,/proc/sys/kernel/pid_max限制最大pid值,影响核心循环计数。logrotate配置用于日志管理。
在Ubuntu .中,apport与漏洞版本差异大,选择替换整个apport文件。遇到程序不运行问题,可能涉及core_pattern配置。通过日志分析发现入参多了一个%E,删去后程序恢复正常。
逃逸步骤
利用条件竞争绕过分支,首先kill对应pid,然后通过大量fork等待创建进程,占用pid。利用docker内进程路径控制物理机中core生成路径。生成core前检查ulimit -c,限制core文件大小,设置ulimit -c unlimited。
逃逸第二步
通过logrotate定时任务触发执行core中的指令,将想运行的指令写成字符串形式,保存在core文件中。使用logrotate格式编写命令,确保成功执行。手动触发logrotate命令,监听对应端口以获取返回结果。
linux系统管理命令shutdown源码linux系统管理命令
linux系统管理--htop命令的使用?1、Htop是一个非常高级的交互式的实时linux进程监控工具。它和top命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。Htop是一个第三方工具,它不包含在linux系统中,你需要使用YUM包管理工具去安装它。
2、CentOS安装htop
#yum-yinstallhtop
3、截图
如何在linux上用命令实现用户和组的管理?
Linux上用命令实现本地用户和组的管理
本地用户和组:管理文件和进程等等
本地用户和组:
1)root:超级管理员系统创建的第一个账户
特点:
id为:0
家目录:/root
具有系统的完全控制权:小心使用。
#id
uid=0(root)gid=0(root)groups=0(root)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c
#
2)普通用户:不具有管理员权限
特点:
id范围:
=id=
家目录:/home/用户名
#idstudent
uid=(student)gid=(student)groups=(student),(wheel)
#
3)服务用户:为服务提供权限
特点:
id范围:
0id
家目录:应用程序服务目录
#idapache
uid=(apache)gid=(apache)groups=(apache)
#
如果是yum,rpm安装的软件:由rpm包中的脚本创建服务账户
Includeconf.modules.d/*.conf
#
#Ifyouwishp传入两个相等对象时返回值必须是false),则可能导致coredump。在数据分布为连续相等值时,如果比较器不符合要求,快排过程中可能会导致last指针越界。
当快排深度达到限制时,STL使用堆排完成排序。__partial_sort函数实现堆排,取出数组中前部分元素并排序。__final_insertion_sort函数则通过插入排序处理局部无序的情况,优化排序速度。
插入排序在数据主体有序时表现出高效性,STL利用这一点进一步优化排序过程。__insertion_sort函数执行插入排序,通过__unguarded_linear_insert函数寻找合适位置插入元素,实现高效排序。
在编写自定义比较器算法时,确保其符合严格弱序关系,即当比较器对象comp传入两个相等对象时返回值为false,以避免核心崩溃(coredump)等问题,确保代码移植性。
至此,我们对std::sort函数的实现流程有了深入理解,避免了由于错误使用导致的coredump问题,实现了更正确的程序设计。