Articles of 进程

从shell避免僵尸进程?

我正在写几个shell脚本来做一些事情: main.sh在屏幕下运行,它设置了一些variables,然后在前台调用: start.sh (no&) 它运行start.sh ,它设置一些Java特定的variables,并启动一个Java进程(再次在前台 ) Java运行并执行它的事情,直到收到一个“退出”命令。 (也在前台 所以我的过程树如下所示: – main.sh \ – start.sh \ – java 问题是,Java程序偶尔会处于一种不遵守“退出”命令的时髦状态,坐在那里欢快地做着事情。 我一直把这个Java进程的进程ID保存到一个PID文件中,并向这些java进程发送-STOP(17?)-TERM(15)和KILL(9)信号,但似乎没有把它们正确地closures。 我可以杀死'start.sh'进程,这会阻止进程树,但会将Java进程置于可怕的死亡(zombie)状态,唯一的解决scheme就是重启服务器。 我想知道是否有人对我如何避免进入这些情况有任何意见,或者是否有任何Linux / shellfunction缺失,可能会阻止这些僵尸进程的发生。 我还应该添加我不能修改Java应用程序代码,因为它是一个专有的应用程序,我没有可用的源代码。 在Fedora 14上运行2.6.35.13-92.fc14.x86_64内核。 提前致谢,

argc从哪里来?

一个新的进程由fork / exec创build。 Exec设置了命令行参数,但是我没有看到它设置了放在argc的那些参数的数量。 main()应该是在新进程中运行的第一个函数,但是argc已经被设置了。 它在哪里设置? 它必须是某种设置代码,在调用main之前对参数进行计数,但是我没有读到什么解释了这个设置代码做了什么或者它驻留在哪里。 这是在libc吗? 这在每个操作系统上都是一样的,并且被某些规范所覆盖? 除此之外,在哪里可以find设置代码中的内容? 在实例化全局variables之前调用它吗?

从bash脚本运行几个命令

我认为这应该是直截了当的,但结果令我困惑。 当我使用该命令运行bash脚本时, sudo ./restartccpd.bash 屏幕上没有任何内容出现。 还发行 sudo /etc/init.d/ccpd status 在运行脚本之后独立于屏幕产生空的,而不是显示守护进程的pid。 这certificate只有pkill命令正在工作。 脚本的内容是, #!/bin/bash sudo pkill -9 ccpd sudo /etc/init.d/ccpd start sudo /etc/init.d/ccpd status 从terminal运行时,这些命令可以正常工作。 但是,如上所述,作为脚本运行时,它并不像预期的那样工作。 我尝试在命令之间插入睡眠命令,无济于事。 此外,syslog中没有任何内容。 所以,我无法诊断问题。 任何build议将不胜感激。

保存/ proc / PID /进程存在后

我希望即使在程序退出之后,进程的/ proc / PID /目录也能被保存一段时间,以便“grand parent”可以从/ proc / PID / stat中检查资源的使用情况。 我不能使用wait4(),因为我关心“grand cild”的资源使用情况。 那么我怎样才能保存/ proc / PID /目录? 注 :在退出程序之前复制/ proc / PID / stat在我的上下文中不是一个解决scheme,因为我需要在整个生命周期中使用该进程的总资源使用情况统计信息。

确定已经运行的进程在文件中有多远

我想看看通过一个文件一个进程是多远。 或者,更准确地说:我想知道进程正在读取的文件的哪一部分。 现在我可以使用像pv命令一样的东西,除了这是行不通的,因为我想在已经运行的进程上这样做。 这里有几个例子: 让我们说一个video在vlc中播放。 我希望能够从另一个节目中了解到videovlc有多远。 或用dd。 比方说,我正在镜像一个硬盘(我知道这个例子有问题,因为有人会愚蠢的启动没有光伏dd,如果他们想跟踪进度(我是一个傻瓜),你可以发送杀死信号到dd获得当前进步,但忽略了这两个事实…)。 这可以用来显示我的转移进度。 我看到在一些linux系统上,可以使用lsof -o来获得偏移量,但是我不知道如何0t1659509部分数据(看起来像这样的0t1659509 )转换成文件有多远过程是或甚至可能的。 另外,知道做一件事的方法不止一种是好的。

如何判断Chef客户端是否安装在Linux上?

我需要一个编程方式(任何方式)来确定Chef客户端是否安装在Linux上。 我能想到的唯一方法是看看/etc/chef存在,但这可能不是傻瓜。 我也在考虑检查knife命令的输出,但是我对厨师客户端的理解是, knife不是客户端安装的必须部分。 换句话说,我相信客户端可以安装,而不是knife 。 思考?

使用fork(),我怎样才能让subprocess始终运行?

subprocess和父进程执行是并行的,首先启动取决于操作系统调度。 但是在父母面前总是能做些什么来启动孩子呢? 这是我的问题的伪代码, int start_test() { pid_t pid; pid = fork(); if(pid == 0) { execv("XXX", XXX); } else if(pid > 0) { pid = fork(); if(pid == 0) { execv("XXX", XXX); } else { // Do something } } return 0; } int main() { start_test(); return 0; } 我想首先执行execv比父进程再次创build新进程。 每个execv都应该按顺序。

C中的代码:在64位系统中发出int数组函数参数

以下C代码在32位Linux上完美工作,但不在64位系统中工作: #define MAX 5 int change(int** ns) { ns[0] = 111; ns[1] = 222; ns[2] = 333; } int main() { int i, nums[MAX]; memset(nums, 0, sizeof(nums)); change((int**) &nums); for (i = 0; i < MAX; i++) printf("nums[%d] = %d\n", i, nums[i]); return 0; } Linux 32位(x86): $ uname -a Linux host-1549776 3.2.0-58-generic-pae #88-Ubuntu SMP […]

subprocess拷贝整个数组吗?

我正在编写一个基本的UNIX程序,它涉及相互发送消息的进程。 我同意进程的想法是简单地有一个标志数组来指示进程是否已经到达代码中的某个点。 例如,我希望所有进程都等待,直到它们全部被创build。 我也希望他们在开始阅读他们的pipe道之前等到他们完成了彼此的消息发送。 我知道一个进程在写入一个以前定义的variables时执行写入时复制操作。 我想知道的是,如果我做了一个标志数组,将指向该数组的指针复制,或者将整个数组复制(从而使我的想法无用)。 我还想要关于进程间通信和进程同步的任何提示。 编辑:进程正在写入对方的过程'pipe道。 每个进程将发送以下信息: typedef struct MessageCDT{ pid_t destination; pid_t source; int num; } Message; 所以,只是消息的来源和一些随机数。 然后每个进程将输出消息到标准输出:沿着“进程20接收来自进程3的5724244”的行。

在linux中创build一个新的信号

有没有办法在Linux中创build自定义信号。 让我们说,当“回声疯狂”在一个文件中执行? 而每当这个信号被执行,我会停止使用该信号的过程…我也想用一个新的信号使用Perl的Enbugger。 有没有办法做到这一点? 我从http://metacpan.org/pod/Enbuggerfind了这个 use Enbugger::OnError qw( USR1 USR2 INT HUP ); USR1和USR2是用户定义的信号。