Articles of 进程

文件所有者:组不会更改位置/ proc / <pid> /后setuid()?

我有要求产生一个进程作为一个根,然后将其权限放到非root用户,所以要实现这个我使用setbit的二进制文件,并将所有者更改为根。 然后我产生了一个非root用户的进程,最初它开始作为根,做了必要的任务之后,我用setuid(getuid())调用将其权限放到非root用户。 这是什么发生的所有者:位置/ proc /(pid)/的所有文件的组/保持根:根。 由于这是由我的进程(删除特权后)产生的线程。 在/ proc /(pid)/ exe中有访问被拒绝的情况。 任何人有任何想法为什么setuid不设置所有者:组在文件位置/ proc /(pid)?

为什么select()在父进程中使accept()在subprocess中不可用?

我有一个父进程创build2个服务器套接字并调用select()在等待新的连接。 当连接到达时,一个消息被发送到subprocess(使用fork()创build,在服务器套接字创build之后,所以它们被共享)。 在这个孩子,在服务器套接字上调用accept()不起作用。 我有一个EAGAIN错误(非阻塞套接字)。 而在主进程中调用accept()完美工作。 当然,我根本不会在主进程中调用accept() ,我只是testing一下,看它是否有效,而且确实如此。 为什么我不能在父进程中的select()之后调用subprocess中的accept() ? 编辑:这里的目标是创build一个固定数量的工人(比方说8)来处理客户连接,就像在prefork模型。 这些连接将是长连接,不像HTTP。 目标是负载平衡员工之间的连接。 为此,我使用一个共享内存variables,其中包含一个工作者当前连接的客户端的数量。 我想“问”具有最less数量的客户端的工作者来处理新的连接。 这就是为什么我在父项中执行select() ,然后将消息发送给subprocess,因为我想“select”哪个进程将处理新的连接。 服务器监听多个套接字(一个用于ssl,一个不用),这就是为什么我使用select()而不是直接accept()在subprocess中,因为我不能accept()在我的子工作人员的多个套接字。

用shell获取父PID?

我想要一个cron作业,将设置一些服务的优先级,但是,父作为根运行,其余的作为另一个用户。 然而,父母会重新使用它的优先级ID来处理进程,所以cron作业将不得不以更多的方式运行。 有没有办法做到这一点来设置优先级? 我想要设置更高的示例: 1 S root 13826 1 0 81 0 – 3289 rt_sig 00:33 ? 00:00:00 nginx: master process /usr/local/sbin/nginx -c /etc/nginx/nginx.conf 5 S root 15474 1 0 75 0 – 3848 – Apr22 ? 00:01:37 /usr/local/apache/bin/httpd -k start -DSSL 5 S nobody 19511 13826 0 75 0 – 3297 – 13:06 ? […]

在这个过程中,怎么能告诉一个进程的父进程?

我知道getppid检索底层程序的父pid,但是你怎么能告诉这个程序呢? 我在/proc/[pid]找不到任何有用的东西,或者是否有任何有用的API可以使用? UPDATE 我的意思是,我正在用另一个进程来检查这些进程,所以getppid在这里不起作用

task_struct存储在哪里?

Task_struct用于保存内核有关进程的必要信息。 由于这种结构,内核可以暂停一个进程,并在一段时间后继续执行。 但我的问题是:这个task_struct在内存中存储在哪里(我已经读过关于内核堆栈,是在虚拟地址空间的内核空间?)? 内核在什么地方保持一个指向那个结构和这个结构的暂停进程? 如果您在描述资源时提供一些参考资料,我将不胜感激。 PS。 我忘了说这个问题是关于Linux内核的。

对于成功执行的进程,可以使用非零返回代码吗?

我正在实现一个简单的作业调度程序,它为每个要运行的作业创build一个新的进程。 当一个工作退出时,我希望它向执行者报告执行的行为的数量。 我能find的最简单的方法就是将返回代码的操作数退出。 例如,该过程将退出,返回代码3为“执行3个动作”。 但是标准(AFAIK)是在进程成功退出时使用返回代码0 ,当出现错误时使用返回代码0 ,这种方法是否会产生任何问题? 注意:subprocess不是可执行的脚本,而是父进程的一个分支,所以不能从外部访问。

我怎样才能在linux上编辑proc / pid / oom_adj进程

我有一个情况,我们的服务器正在杀死一个我不想被杀死的进程。 我的理解是,这是因为内核过度使用内存,然后在内存耗尽时被迫终止进程。 我的理解是,通过调整以下值,我可以影响内核关于在这种情况下杀死哪个进程的决定: 的/ proc / [PID] / oom_adj 本文解释了所有这些: http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html 但是,当我以ubuntu用户身份试用这个命令时,我得到了Permission denied错误: echo -15> / proc / 5641 / oom_adj -bash:/ proc / 5641 / oom_adj:权限被拒绝 sudo echo -15> / proc / 5641 / oom_adj 给出了相同的错误我的理解是,这是因为shell没有以root身份执行“>”命令。 但是,我熟悉的解决方法是给“没有这样的文件或目录”错误。 sudo bash -c'echo -15> / proc / 5641 / oom_adj' -bash:/ proc / 5641 / oom_adj':没有这样的文件或目录 sudo […]

在后台启动脚本时,我得到两个进程正在运行

我遇到了一个奇怪的场景,正在困扰着我。 我有一个脚本,我在后台启动一个& 例: root@# some_script.sh & 运行后,我做一个ps -ef | grep some_script,我看到两个进程正在运行的地方,第二个进程不断获得不同的PID,但是Parent是我开始的进程(就像父进程产生的subprocess一样 – 但从未写在代码中)。 例: root@# ps -ef | grep some_script.sh root 4696 17882 0 13:30 pts/2 00:00:00 /bin/bash ./some_script.sh root 4778 4696 0 13:30 pts/2 00:00:00 /bin/bash ./some_script.sh root@# ps -ef | grep some_script.sh root 4696 17882 0 13:30 pts/2 00:00:00 /bin/bash ./some_script.sh root 4989 […]

在短时间内减less自己的优先级,然后再增加它

在某些情况下,我想减less正在运行的进程优先级来执行一个昂贵的操作 ,然后将其增加回原始值。 这个过程应该自己做,没有root权限 。 我已经尝试使用Process.setpriority在一个Ruby应用程序内部。 这个内核的devise是否有缺陷? 这里是shell中的一个例子: $ nice 0 然后 $ renice -n 19 -p $$ 5094 (process' ID) old priority 0, new priority 19 然后 $ renice -n 0 -p $$ renice: failed to set priority for 5094 (process' ID): Permission denied

在Linux和Windows上,进程pipe理代码的performance有所不同 – 为什么?

(上下文)我正在开发一个基于BitTorrent Sync的跨平台(Windows和Linux)应用程序,用于在计算机之间分发文件。 我已经在C#中完成了,现在正在向C ++移植。 BTSync可以在API模式下启动,为此,必须启动“ btsync ”可执行文件,将configuration文件的名称和位置作为parameter passing。 在这一点上,我最大的问题是让我的应用程序处理可执行文件。 在寻找一个跨平台的stream程pipe理库的时候,我已经find了Boost.Process ,并决定尝试一下。 看来v0.5是最新的工作版本,正如有证据表明的那样,有很多人在使用它。 我按如下方式实现了库(仅适用于相关代码): 文件: test.hpp namespace testingBoostProcess { class Test { void StartSyncing(); }; } 文件: Test.cpp #include <string> #include <vector> #include <iostream> #include <boost/process.hpp> #include <boost/process/mitigate.hpp> #include "test.hpp" using namespace std; using namespace testingBoostProcess; namespace bpr = ::boost::process; #ifdef _WIN32 const vector<wstring> EXE_NAME_ARGS = […]