标签: spawn

如何产生不与父亲一起死亡的儿童过程?

我有一个C++程序,可以作为其他人的监督者.如果它检测到进程不再运行,则通过它重新启动它system.问题是,如果我杀死看门狗进程,它启动的任何进程也会死掉.

void* ProcessWatchdog::worker(void* arg)
{
    //Check if process is running
    if( !processRunning )
        system("processName /path/to/processConfig.xml &");
}
Run Code Online (Sandbox Code Playgroud)

新的子进程正确启动,并且运行没有任何问题.但是当父母(现在这个ProcessWatchdog过程)死亡时,孩子也会死亡.如何生成完全独立于父级的子进程?

我已经尝试过使用pclosepopen运行启动进程的shell脚本,以及其他一些策略,但无济于事.我忽略SIGHUP了子进程中的信号,但它们仍然死亡.

理想情况下,我想告诉系统启动一个完全独立于父级的进程.我希望孩子trace以孩子结束,因为它/系统不知道从一ProcessWatchdog开始就开始了它.

有没有办法可以做到这一点?

我在Linux上用C++编写这个.

c++ linux fork parent-child spawn

6
推荐指数
2
解决办法
1万
查看次数

让NodeJS应用程序使用NPM更新自己

嘿那里,

我正在尝试为我的NodeJS应用程序添加一些非传统功能,但我遇到了一些麻烦.我想要做的是以下内容:

我想从客户端更新我的服务器代码.(如果您愿意,可以使用自动更新功能.)

我的第一次尝试是使用NPM API并运行:

 npm.commands.install([package], function(err, data)
Run Code Online (Sandbox Code Playgroud)

但是当然这会导致错误告诉我在服务器运行时NPM无法安装.

我的第二次尝试是使用以下代码生成NPM更新:

  spawnProcess('npm', ['update'], { cwd: projectPath }, done);
Run Code Online (Sandbox Code Playgroud)

spawnProcess函数是一个通用的spawn函数:

var projectPath = path.resolve(process.cwd());
var spawnProcess = function(command, args, options, callback) {
    var spawn = require('child_process').spawn;
    var process = spawn(command, args, options);
    var err = false;

    process.stdout.on('data', function(data) {
        console.log('stdout', data.toString());
    });

    process.stderr.on('data', function(data) {
        err = true;
        console.log('stderr', data.toString());
    });

    if (typeof callback === 'function') {
        process.on('exit', function() {
            if (!err) {
                return callback();
            }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

但这给了我一个stderr,然后是'CreateProcessW:找不到文件'错误.我不太清楚我做错了什么.

如果所有其他方法都失败了,我认为可能编写一个shellcript kill …

javascript spawn node.js npm

6
推荐指数
1
解决办法
3858
查看次数

从Node.js中设置全局环境变量

我试图从我的node.js应用程序中设置一个全局环境变量.

目标是:

  1. 重新启动APP时,仍应设置环境变量
  2. 打开一个新shell时,它应该是可用的
  3. 如果可能:重新启动时,与1相同.
  4. 它应该适用于Linux,Mac OS X(并且需要Windows的备用SET命令)

这是我做的:

var setEnv = require('child_process')
        .spawn('export GLOBALVARNAME='+my.value,{
          stdio: 'inherit',
          env: process.env
        });
Run Code Online (Sandbox Code Playgroud)

但这导致了

{ [Error: spawn export GLOBALVARNAME=foobar ENOENT]
  code: 'ENOENT',
  errno: 'ENOENT',
  syscall: 'spawn export GLOBALVARNAME=foobar',
  path: 'export GLOBALVARNAME=foobar',
  spawnargs: [] }
Run Code Online (Sandbox Code Playgroud)

我没有在Windows上对此进行测试,但在Mac OS X(和Linux)上,bash上的正确命令是export GLOBALVARNAME=value.对于Windows,正确的命令应该是SET GLOBALVARNAME=value- 不是吗?

所以主要问题是:手动工作出了export GLOBALVARNAME=foobar什么问题?

bash env spawn node.js

6
推荐指数
1
解决办法
6400
查看次数

Python:生成另一个程序

我有一个 Python 程序,从中生成一个子程序来处理一些文件,而不会中断主程序。我目前正在使用 bash 作为子程序,以一个命令和两个参数开始,如下所示:

result = os.system('sub-program.sh file.txt file.txt &')
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我(最终!)意识到我可以使用 Python 作为子程序,这会更好,所以我已经转换了它。生成它的最简单方法可能是:

result = os.system('python3 sub-program.py file.txt file.txt &')
Run Code Online (Sandbox Code Playgroud)

一些研究已经展示了几种更复杂的替代方法,但我的印象是最新且最受认可的方法是以下一种:

subprocess.Popen(["python3", "-u", "sub-program.py"])
Run Code Online (Sandbox Code Playgroud)

我认为这是最合适的做法是否正确?有人会推荐不同的方法吗?为什么?简单就好了,因为我是一个 Python 新手。

如果这是推荐的方法,我可能可以弄清楚“-u”的作用以及如何为自己添加参数。

可选附加功能:

  • 从子程序向主程序发送回消息。
  • 让子程序在主程序退出时退出。

python spawn

6
推荐指数
1
解决办法
3089
查看次数

当shell终止时,Windows上生成的Ruby进程将死亡

我试图在Windows上使用以下内容生成Ruby进程:

p1 = spawn('ruby', 'loop.rb', [:out, :err] => ['process.log', "w"],  :new_pgroup => true)
Run Code Online (Sandbox Code Playgroud)

然后我也通过以下方式脱离了这个过程:

p1.detach
Run Code Online (Sandbox Code Playgroud)

到目前为止,我应该理解创建一个独立于父进程的新进程.我甚至使用new_pgroup参数来确保新进程获得自己的进程组.

当我执行我的脚本时,子进程启动并继续运行.产生子进程的脚本的执行也完成了.但是,当我现在关闭shell时,子进程就会死掉.我希望它能继续运行(它在OS X和Linux上运行).我无法弄清楚这是否是Windows上Ruby运行时的错误,或者这是否是Windows的限制以及它如何处理进程.

为了完整性,我想要做的完整Ruby代码:


spawner.rb:可以通过执行ruby spawner.rb并生成一个新的子流程.进程创建的是loop.rb,这只是一个无限循环.根据操作系统,它为进程组创建指定了不同的参数.

require "tempfile"
require 'rbconfig'

class SpawnTest

  def self.spawn_process

    if os == :windows
      p1 = spawn('ruby', 'loop.rb', [:out, :err] => ['process.log', "w"],  :new_pgroup => true)
    else
      p1 = spawn('ruby', 'loop.rb', [:out, :err] => ['process.log', "w"],  :pgroup => true)
    end

    # Detach from the processes so they will keep running
    puts p1
    Process.detach(p1)
  end

  def self.os …
Run Code Online (Sandbox Code Playgroud)

ruby windows shell powershell spawn

6
推荐指数
1
解决办法
420
查看次数

如何让 child_process.spawn 在我的 TypeScript 模块中返回一个 Promise?

我正在尝试编写一个child_process.spawn用于克隆 git repo 并返回一个 Promise的小模块,但它在我身上失败了。当我使用 spawnSync 时,它可以工作。

这是有效的同步代码。

import {spawnSync} from 'child_process';
export default async function clone(options: { url: string; path: string; }) {
  const url = options.url;
  const target = options.path;
  const args = ['clone', url, target];
  return spawnSync('git', args);
}
Run Code Online (Sandbox Code Playgroud)

这是失败并返回的异步代码 undefined

import {spawn} from 'child_process';
export default async function clone(options: { url: string; path: string; }) {
  const url = options.url;
  const target = options.path;
  const args = ['clone', url, target];
  const process = spawn('git', …
Run Code Online (Sandbox Code Playgroud)

spawn child-process async-await typescript

6
推荐指数
1
解决办法
5399
查看次数

运行`cover -test`时如何从子进程收集覆盖率,否则不收集?(开发::封面)

(我想我已经看到了这个问题的答案,但我再也找不到了。我遇到的最接近的是这个问题)。

我正在对prt 进行黑客攻击,并试图为我的更改获取完整的覆盖数据。我的一些新测试调用system($^X, 'prt', ...)运行子进程。然后我测试这些进程的输出。但是,Devel::Cover 不会在子进程中收集覆盖率数据。我如何收集该数据,而不会导致 Devel::Cover 在我执行常规操作时运行make test?目前我有一个丑陋的解决方法(见下文),但我认为必须有一个更简单的方法。

完整的 MCVE 在这里。命令行复制,为您提供方便:

git clone https://github.com/cxw42/multi-process-devel-cover-test.git ; cd multi-process-devel-cover-test ; perl Makefile.PL ; make ; cover -test
Run Code Online (Sandbox Code Playgroud)

注释掉t/01-help.t下面描述的解决方法的第 11 行。

编辑我使用的原因system是为了得到100%覆盖上-h/ --help/ --version。这些开关由自动调用的Getopt::Long处理exit()。如有必要,我可以-exitval=>NOEXIT在自己的代码中使用和处理退出。

行不通的事情

PERL5OPT

$ PERL5OPT=-MDevel::Cover=-silent,1 cover -test
/home/cxw/perl5/perlbrew/perls/perlcygbrew-5.26.2-1/bin/cover shouldn't be run with coverage turned on.
Run Code Online (Sandbox Code Playgroud)

HARNESS_PERL_SWITCHES+cover

$ HARNESS_PERL_SWITCHES=-MDevel::Cover=-silent,1 cover -test
...
t/01-help.t …
Run Code Online (Sandbox Code Playgroud)

perl code-coverage spawn devel-cover

6
推荐指数
1
解决办法
218
查看次数

6
推荐指数
1
解决办法
5892
查看次数

任务组 `async` 与 `spawn`

有谁知道,在新的 Swiftasync/await东西中,TaskGroupasync和之间有什么区别spawn,或者它们是纯同义词吗?(如果它们是同义词,我更喜欢spawn更好。async看起来我们正在打开一个async块,而这根本不是我们在做什么。)

https://developer.apple.com/documentation/swift/taskgroup/3814850-async

https://developer.apple.com/documentation/swift/taskgroup/3814884-spawn

spawn async-await swift swift5.5

6
推荐指数
1
解决办法
115
查看次数

无效参数:隔离消息中的非法参数:(对象是aReceivePort)

我不确定我在这段代码中是否做错了什么,但我在生成新隔离时显然传递了 SendPort,但是当我调用时: Infrastructure.instance.initialize();我收到以下异常:

Invalid argument(s): Illegal argument in isolate message: (object is aReceivePort)

这是基本实现Infrastructure

class Infrastructure {
  late final SendPort _sendPort;
  late final ReceivePort _receivePort; 

  Infrastructure._() {
    _receivePort = ReceivePort();
    Isolate.spawn(_processWorkItemsInBackground, _receivePort.sendPort,
        debugName: 'InfrastructureIsolate');

    _sendPort = _receivePort.first as SendPort;
  }

  Future<void> dispose() async {
    // Send a signal to the spawned isolate indicating that it should exit:
    _sendPort.send(null);
  }

  static final Infrastructure instance = Infrastructure._();

  void initialize() {}

  Future<void> _processWorkItemsInBackground(SendPort sendPort) async {
    ModuleLogger.moduleLogger.info('Infrastructure isolate started.');

    // …
Run Code Online (Sandbox Code Playgroud)

spawn dart dart-isolates

6
推荐指数
1
解决办法
4377
查看次数