Articles of 进程

Linux:程序A运行程序B,杀死A,replaceA,然后重新启动A – 带有inheritance的打开文件描述符的问题

我有一个服务器进程,这个服务器进程可以给一个命令来更新自己。 它所做的是存储更新,然后使用system()在后台运行更新脚本。 更新脚本杀死父进程,删除二进制文件,replace它,然后重新启动它。 由于各种原因,重新启动的进程失败,因为我试图debugging它,但这次是因为我正在尝试分配的TCP端口已被使用。 我猜测,subprocessinheritance了打开的端口,然后由更新的服务器进程inheritance,因此,该端口不是空闲的进程再次分配。 更新脚本启动的方式是这样的: system("/usr/local/bin/update_script.sh > /dev/null 2>&1 &"); 然后脚本做到这一点: killall server_process rm /usr/local/bin/server_process cp /tmp/update/server_process /usr/local/bin server_process > /dev/null 2>&1 & 有关我如何做这项工作的任何build议? 有什么办法可以分离更新脚本,以便在执行更新之前服务器进程不再是其父进程? 或者让subprocess不inheritance父进程的任何资源? 谢谢。 附录:解决方法是在每个打开的文件描述符上设置FD_CLOEXEC 。 不幸的是,其中一些fd被埋在图书馆里,我不得不认真的破解FD_CLOEXEC 。 不知何故,我需要使FD_CLOEXEC默认。 或者我需要做一些激烈的事情,比如迭代所有打开的fd(如何?)并设置FD_CLOEXEC 。

强制内存分配在64位Linux上从更高地址(> 4GB)分配

这里是我想要做的:我有一个为64位Linux构build的库。 然后我创build了一个链接该库的应用程序。 我想确保在运行应用程序时,从库中分配的内存始终位于较高的位置(> 4GB)。 在Windows上,用户可以强制分配以便在testing之前从较低地址分配较高地址,在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下registry值设置为0x100000: HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Memory Management \ AllocationPreference 我不知道在Linux上是否有类似的策略。 我了解Linux内存pipe理与Window不同,但是我发现了一些线索,例如使用mmap()或者链接器脚本。 但是我一直无法实现这个目标。 任何人都可以提供更多的信息? #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main() { void *addr1=0, *addr2=0; long sz = sysconf(_SC_PAGE_SIZE); // get page […]

后台进程closuresssh客户端后终止

我的问题和我已经在这里 , 这里和这里find的一样 。 但是,对我来说nohup不起作用。 编译screen给出错误,并且不允许,Control + Z不会使进程“停止”。 我运行一个将数据写入文件的数据生成二进制文件,并在屏幕上输出状态消息(stdout)。 我尝试了以下 nohup ./sp2b <options for sp2b> > output & 当我注销terminal并重新login时,进程已经被终止。 我其实也想花时间,所以想做的 nohup time ./sp2b <options for sp2b> > output & 为什么nohup不在我的情况下工作?

学习Unix和C – 查看进程,文件和v节点表

我目前正在阅读关于Unix环境下高级编程的书中的进程表,文件表和V节点表。 为了帮助我理解,能够查看进程表,文件表和v节点表以及它们之间的关系是有用的。 我在编写和debuggingc代码时如何查看这些内部结构? 我试图用ps和ls的输出将内部结构信息拼凑在一起,勾画纸上的关系来形象化结构,但是这样做很慢。 互联网上似乎有很多关于查看进程表的post,但没有查看进程表,文件表和v节点表及其关系。

我是否可以检测到从长期运行的后台进程中提前退出?

我正在尝试改进群集环境中运行的多个服务器的启动脚本。 服务器进程应该无限期运行,但偶尔在启动时会失败,例如, Address already in useexception。 我希望启动脚本的退出代码能够反映出这些早期的终止,比如等待1秒,并告诉我服务器是否已经开始好了。 我还需要服务器PID回显。 这是迄今为止我的最佳射门: $ cat startup.sh # start the server in the bg but if it fails in the first second, # then kill startup.sh. CMD="start_server -option1 foo -option2 bar" eval "($CMD >> cc.log 2>&1 || kill -9 $$ &)" SERVER_PID=$! # the `kill` above only has 1 second […]

即使二进制大小很大,64位C ++二进制文件也会消耗巨大的内存

当我们在32位编译我们的C ++应用程序时,一切都还好。 当我们将所有的东西移植到64位时,二进制文件的数量增加了一倍多! 当我们运行二进制文件时,只有一个运行,因为它占用了所有的RAM。 我们已经完成了所有的64位移植操作,以便编译成功。 但是,在运行时,内存消耗会达到极限。 它不会崩溃。 它只是运行,直到停止,并没有生成核心文件。 有没有人有什么build议,我应该开始调查呢? 我们的编译选项是: -D_linux _ -pthread -fexceptions -c -Wall -DSTL_HAS_DEFAULT_ARGS -DUsePthread -D_REENTRANT -Dx86_64 -DLINUX -g -O2 我们的Linux机器上的ulimit信息是: -bash-4.1$ ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 30405 max locked memory […]

处理系统重启产生的信号

每当我给重新启动命令,我的进程正在接收SIGTERM信号,正在处理它。 如果SIGTERM由于重新启动,我不想处理它。 请build议我任何想法。 有没有办法发送kill -9信号给我的进程,当我做system("reboot") ? 我正在使用Cent OS(Linux)。

检查进程是否正在运行的脚本,如果没有运行,则执行一行代码

我如何创build一个脚本来检查一个进程是否正在运行,当它没有运行的时候执行一行代码? 让脚本每分钟检查一次? 我正在想这样的事情: #! /bin/bash case "$(pidof Program.exe | wc -w)" in 0) echo "Restarting Program: $(date)" >> /var/log/ProgramLog.txt (mono-runtime Program.exe -option1 yes -option2 no -option3 6; 1) & ;; 1) # all ok ;; *) echo "Removed double Program: $(date)" >> /var/log/ProgramLog.txt kill $(pidof Program.exe | awk '{print $1}') ;; esac 0:如果找不到进程执行代码 1:如果发现进程什么都不做 *:如果有超过1个进程发现停止最后一个 […]

为什么起源的过程开始作为僵尸在Qt-app。 Linux的

我正在使用qt创build器在linux上编写一个小应用程序。 当我开始我的应用程序,我希望它执行一个shell命令。 我是这样使用QProcess的: int main(int argc, char *argv[]) { MyApplication a(argc, argv); QProcess mapProc(&a); QString command; QStringList args; command = "java"; args << "-jar" << "/home/$USER/MapServer/map.jar" << "localhost" << "9797" << "12123"; mapProc.start(command, args); bool flag = mapProc.waitForStarted(); QProcess::ProcessState state = mapProc.state(); qDebug() << mapProc.errorString(); qDebug() << mapProc.pid(); /*///////////////// some code /////////////////*/ return a.exec(); } […]

在Linux操作系统上找不到PHP脚本作为运行进程?

我在我的Amazon Linux上有一个PHP文件 <?php sleep(600); 我点击一个公开的URL来运行这个文件。 当文件正在运行时,我运行 ps aux 在我的Linux机器上,但我无法从列表中find相应的进程。 我也试过了 ps ax | grep *.php 这不会返回任何结果。 为什么我无法find我的PHP程序?