CentOS上的root用户进程和非root进程有什么优先级区别? 当我以root用户的身份在nodejs服务器上运行时,它会顺利进行,并且经过一段时间(比如几个星期后)就会挂起整个服务器,并且需要重新启动。
为什么CentOS不能杀死或终止这个过程? 是否因为以root用户身份运行该服务?
根据定义,作为UID 0执行的进程不受文件系统或系统约束的限制(大部分/ etc / limits中的限制被视为build议,可以旋转内核参数)。 我build议跟踪这个进程消耗的内存和CPU的数量,以及随着时间的推移跟踪磁盘和networkingIO的饱和度。
我敢打赌,这个过程要么是内存泄漏,要么正在慢慢地让系统挨饿(而不是被限制),最终导致其他进程被OOM杀手(包括SSHD,Apache等) ,或者它有一个句柄泄漏,最终导致其他进程访问文件句柄,以用于诸如TTY会话或访问configuration文件之类的事情。
您可以设置net-snmp来显示networkingIO,内存和CPU利用率,并随着时间的推移使用MRTG(当然在另一个盒子里面运行)来跟踪它,看看这是怎么回事。 由于问题可能需要几周时间才能显示出来,MRTG的默认粒度(每5分钟一次)应足以说明趋势。
root用户有权覆盖几乎所有的系统设置。 除了文件系统的访问权限之外,根拥有的进程通常必须明确地要求一些改变,而不是仅仅获得特殊的访问权限或优先权。
例如进程具有“优先”优先级(请参阅man nice ),该进程指示哪个进程获得CPU时间的更高优先级访问权限。 根拥有的进程根据自己的好处进行调度,但是其他进程只能增加自己的好处,根用户也可以减less它(假设更高的优先级)。
类似的规则适用于资源限制(ulimit)和ionice。 这与DTK似乎对ulimit的看法是相反的,但请注意,ulimit是一种BSD技术,只能在linux中部分实现。 ulimit命令行界面将默默地允许你指定内核实际上忽略的一些限制。 资源限制还包括一个只能由root设置的硬限制,活动用户可以修改当前有效的软限制。
如果一个进程不能被杀死,通常是因为它正在等待一些内核调用来完成。 最常见的例子是在一个文件系统上等待一个文件系统的动作,这个文件系统已经消失了,或者可能只是被重载了,所以直到内核调用完成之后, kill动作才能继续。 在networking连接中断的远程挂载文件系统的情况下,呼叫可能永远不会完成。
另外需要注意的是,如果可能的话(或者以root身份启动,请尽快更换用户),您很less要以root身份运行守护进程/长时间运行的任务。 根用户比其他账户拥有更多的权力,因此,如果被破坏,可以执行显着的破坏性行动。 大多数networking服务的BCP是将服务作为自己的帐户运行在其自己的受限目录子树中,而不受其沙箱外的任何其他资源的权限。 你的代码可能是完美的,但是如果badguy可以在你使用的库或nodejs解释器中find缺陷,那么badguy可以破坏你的代码,如果以root身份运行,可能会造成更多的损害。