Articles of 守护进程

长时间运行java进程

我已经inheritance了一个应该在Linux服务器的后台运行的java系统。 方向要求它启动java -jar start.jar 。 这似乎有点太脆弱,我喜欢。 我希望它实际上在后台运行,理想情况下启动时自动启动。 达到这个目标的最好方法是什么? 我已经研究过在screen环境下运行系统,这个工作正常,但是当系统重新启动时不会自动启动。

守护进程PHP:主进程在subprocess崩溃时退出

我有一些用PHP编写的linux守护进程来做一些后台工作。 有一个“主”进程有时会通过pcntl_fork产生工作进程并pcntl_fork进行控制。 这是(相当微不足道的)代码: private function SpawnWorker($realm, $parallelismKey) { $pid = pcntl_fork(); if ($pid) { $worker = DaemonInstance::Create($pid, $realm, $parallelismKey); $worker->Store(); $this->workers[$pid] = $worker; return $worker; } else if ($pid == 0) // we're in child process now return Daemon::REINCARNATE; else xechonl("#red#UNABLE TO SPAWN A WORKER ($realm, $parallelismKey)"); return false; } 在用“ posix_setsid ”值返回之后,新的工作进程调用posix_setsid ,它返回一个新的会话ID。 但是如果这个过程崩溃了,主人也会默默退出。 […]

一种在Linux内部进行应用程序通信的方法

我目前正在计划阶段,可以帮忙。 我将使用与各种模块插入(i2C,USB等),它可以是任何东西,如测量温度,风速,方向等模块。 这个想法是让每个模块运行自己的守护进程,这个守护进程会根据请求将数据传给主程序,或者主程序可以请求守护进程重启。 所有这一切都将发生在树莓派上,而不是通过任何forms的networking。 我的问题是主程序和守护进程之间的通信。 我一直在阅读关于使用dbus的知识,但是有不less的说法是用它作为最后的手段。 我一直在研究一段时间,不能拿出任何其他(也许更容易)的方式。 在一个侧面说明,把它们分开的想法是因为如果任何模块有问题,我可以很容易地重新启动它,而不影响主程序。

Linux / Bash文件描述符在执行守护进程时

我正在为我正在编写的C项目编写一个服务脚本,并在启动时执行一些实用程序。 我想要使​​用日志工具捕获所有的输出。 我在/ etc / rc5 / myscript中有类似的内容 #!/bin/bash #save fd 1 in fd 3 for use later exec 3<&1 $SERVICESCRIPT | logger logging器只是从stdin读取,直到碰到EOF。 第二个脚本是检查一堆公用程序是否正在运行,并触发它自己的一些。 在这些公用事业中,有一个分叉并成为守护进程。 现在,我从脚本运行它,它inheritance了所有的脚本fds。 这会导致脚本在被调用后永远不会返回到命令行。 我试图用几种方法来解决这个问题: 首先,在我的脚本中,我已经完成了以下工作: ( exec 4<&- exec 3<&- $daemon_process ) 这应该启动一个下标,closures3和4(分别用于存储标准输出和pipe道输出)并运行程序。 但是当我试图回到命令行的时候,我仍然觉得这是一个悬而未决的问题,这使我相信pipe道并没有closures。 经过进一步调查,如果我在closures后发出回声,并将它们redirect到input到logging器的fd,我会在日志中看到它们,告诉我fd确实仍然是机智的。 如果我在c程序中closuresfds 2-4,我会看到它返回到命令行,但这是一个非常混乱和不愉快的修复。 其次我尝试了以下内容: $daemon_process 4<&- 3<&- 在调用这个程序的时候应该closuresfds,但是我看到了脚本永远不会回到命令行的结果。 当脚本手中我可以“CTRL-C”它把它回到命令行,但这绝不是一个解决scheme。 有任何想法吗? 谢谢!!!!

在Linux上通过C ++代码启动/停止守护进程

我正试图find一种方法来从我的程序启动自定义守护进程。 守护进程本身是使用双分叉机制实现的,如果直接启动,可以正常工作。 到目前为止,我已经遇到了各种启动守护进程的方法: 创build一个init脚本并将其安装到init.d目录。 使用start-stop-daemon命令启动程序。 创build.desktop文件并放置在其中一个自动启动path中。 虽然已知前两种方法使用命令行启动服务,但第三种方法是在用户login时自动启动服务(或任何其他应用程序)。 到目前为止,我的猜测是程序可以使用exec()系列函数直接执行,或者可以通过system()函数执行“start-stop-daemon”命令。 有没有更好的方法来启动/停止服务?

将数据写入stderr会使程序在成为守护程序后退出

请看这个代码。 它运行在CentOS6 64位。 #include<stdio.h> int main(int argc, char **argv) { fprintf(stderr, "output 1\n"); printf("output 2\n"); fflush(stdout); system("echo abc"); fprintf(stderr, "output 3\n "); printf("output 4\n"); fflush(stdout); daemon(0, 1); fprintf(stderr, "output 5\n"); printf("output 6\n"); fflush(stdout); system("echo abc"); fprintf(stderr, "output 7\n"); printf("output 8\n"); fflush(stdout); } 如果我运行它,我会看到这些消息: output 1 output 2 abc output 3 output 4 output 5 output […]

使用PID文件杀死一个守护进程

运行守护进程时,常见的Linux / UNIX习惯是产生守护进程,并创build一个只包含守护进程进程ID的PID文件。 这样,停止/重新启动守护进程,你可以简单地使用kill $(cat mydaemon.pid) 现在,这里有很多的机会不一致的状态。 假设运行守护进程的机器被强制closures,然后重新启动。 现在你有一个PID文件,它指的是一个不存在的进程。 好吧,没问题…你的守护进程只会试图杀死不存在的进程,发现它不是一个真正的进程,并像往常一样继续。 但是…如果这是一个真正的过程 – 只是不是你的守护进程? 如果是别人的过程或其他重要过程呢? 你无法知道 – 所以杀死它是有潜在危险的。 一种可能性是检查过程的名称 。 当然,这也不是万无一失的,因为没有理由,另一个进程可能不会有相同的名称。 特别是,例如,如果你的守护进程在像Python这样的解释器下运行,在这种情况下,进程名永远不会是唯一的 – 它只是“python”,在这种情况下你可能会无意中杀死别人的进程。 那么我们如何处理这样的情况,我们需要重新启动一个守护进程? 我们怎么能知道pid文件中的PID必然是守护进程?

无法在Ubuntu上运行systemd服务守护进程(如何切换到Upstart或者是否有更新的发行版)

注:我没有任何深层次的pipe理服务器或使用Linux的真实经验,所以我的知识和理解是相当有限的。 本质上,我正在这样做。 完整的代码示例请参阅: https : //github.com/Integralist/Vagrant-Examples/tree/master/nodejs 这是一个两部分问题: 无法挂载我的共享目录 systemd服务不可用 我正在尝试创build一个启动NodeJS应用程序的服务,但是看起来systemctl在我安装的Ubuntu版本上不可用( https://vagrantcloud.com/ubuntu/trusty64 )。 这是我的Vagrantfile : # -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/trusty64" # Working arround the "stdin: is not a tty" error, which appears when provisioning # config.ssh.pty = true config.vm.network :forwarded_port, guest: 80, […]

守护进程无法继续存在

我正在为Debian Sid编写守护进程应用程序。 它在绝大多数时候都能正常工作,但是当我把笔记本电脑挂起(或hibernate)之后,就会无声无息地死去。 所以我有几个问题: 我应该怎样Google解决scheme? 也许,你有什么想法是怎么回事?

附加守护进程valgrind并收集每个守护进程调用的日志

我有一个客户端服务器系统,完全用C ++编写。 服务器作为/etc/init.d/serverd以启动/停止选项运行。 Client.exe以client.exe –options执行任何命令。 每次客户端调用,守护进程都会打开。 我想用/etc/init.d/serverd附加valgrind来检测泄漏。 我尝试下面的选项,但失败了。 /usr/local/bin/valgrind –log-file=valgrind_1.log -v –trace-children=yes –leak-check=full –tool=memcheck –vgdb=yes –vgdb-error=0 /etc/init.d/ serverd start 每次都无法附加守护进程。 我们想要的是在开始的时候把valgrind和守护进程valgrind在一起[ the exact point is , I will stop daemon , attach valgrind with it and then start it again ]这样每次执行client.exe –options日志都应该是在–log-file=valgrind_1.log为守护进程生成 有没有人有关于如何做同样的想法?