我有一个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过程)死亡时,孩子也会死亡.如何生成完全独立于父级的子进程?
我已经尝试过使用pclose和popen运行启动进程的shell脚本,以及其他一些策略,但无济于事.我忽略SIGHUP了子进程中的信号,但它们仍然死亡.
理想情况下,我想告诉系统启动一个完全独立于父级的进程.我希望孩子trace以孩子结束,因为它/系统不知道从一ProcessWatchdog开始就开始了它.
有没有办法可以做到这一点?
我在Linux上用C++编写这个.
嘿那里,
我正在尝试为我的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 …
我试图从我的node.js应用程序中设置一个全局环境变量.
目标是:
这是我做的:
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什么问题?
我有一个 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”的作用以及如何为自己添加参数。
可选附加功能:
我试图在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) 我正在尝试编写一个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) (我想我已经看到了这个问题的答案,但我再也找不到了。我遇到的最接近的是这个问题)。
我正在对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) 如何在nodejs中查看Fork和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
我不确定我在这段代码中是否做错了什么,但我在生成新隔离时显然传递了 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 ×10
node.js ×3
async-await ×2
fork ×2
bash ×1
c++ ×1
dart ×1
devel-cover ×1
env ×1
javascript ×1
linux ×1
npm ×1
parent-child ×1
perl ×1
powershell ×1
python ×1
ruby ×1
shell ×1
swift ×1
swift5.5 ×1
typescript ×1
windows ×1