在Windows上,subprocess.Popen.terminate调用win32 TerminalProcess.但是,我看到的行为是我尝试终止的进程的子进程仍在运行.这是为什么?如何确保进程启动的所有子进程都被终止?
我试图从multiprocessing.Process中获取一个traceback对象.不幸的是,通过管道传递异常信息不起作用,因为无法对pickback对象进行pickle:
def foo(pipe_to_parent):
try:
raise Exception('xxx')
except:
pipe_to_parent.send(sys.exc_info())
to_child, to_self = multiprocessing.Pipe()
process = multiprocessing.Process(target = foo, args = (to_self,))
process.start()
exc_info = to_child.recv()
process.join()
print traceback.format_exception(*exc_info)
to_child.close()
to_self.close()
Run Code Online (Sandbox Code Playgroud)
追溯:
Traceback (most recent call last):
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap
self.run()
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run
self._target(*self._args, **self._kwargs)
File "foo", line 7, in foo
to_parent.send(sys.exc_info())
PicklingError: Can't pickle <type 'traceback'>: attribute lookup __builtin__.traceback failed
Run Code Online (Sandbox Code Playgroud)
有没有其他方法来访问异常信息?我想避免传递格式化的字符串.
我正在尝试在python中编写一些简短的脚本,这将在子进程中启动另一个python代码,如果尚未启动,则终止终端和应用程序(Linux).
所以它看起来像:
#!/usr/bin/python
from subprocess import Popen
text_file = open(".proc", "rb")
dat = text_file.read()
text_file.close()
def do(dat):
text_file = open(".proc", "w")
p = None
if dat == "x" :
p = Popen('python StripCore.py', shell=True)
text_file.write( str( p.pid ) )
else :
text_file.write( "x" )
p = # Assign process by pid / pid from int( dat )
p.terminate()
text_file.close()
do( dat )
Run Code Online (Sandbox Code Playgroud)
应用程序从文件".proc"读取的pid命名过程缺乏知识的问题.另一个问题是解释器说名为dat的字符串不等于"x" ??? 我错过了什么?
我正在使用fork()C/C++ 创建子进程.
当父进程结束(或由于某种原因被杀死)时,我也想要杀死所有子进程.
这是由系统自动完成的吗?或者我必须自己做?
谢谢.
预先存在的类似问题:
PHP有两个密切相关的函数,escapeshellarg()和escapeshellcmd().他们似乎都做类似的事情,就是帮助一个字符串更安全的使用system()/ exec()的/ etc.
我应该使用哪一个?我只是希望能够接受一些用户输入并在其上运行命令,而不是让一切都爆炸.如果PHP有一个exec-type-function,它接受了一个绕过shell的字符串数组(比如argv),我会使用它.类似于Python的subprocess.call()功能.
我想终止一些进程,但我希望每个进程都有机会保存其数据,询问用户是否保存文件,甚至忽略关闭请求.
所以TerminateProcess不可能,因为它立即杀死了这个过程.另一种方法是使用SendMessage/ PostMessage发送WM_CLOSE到主窗口,不幸的是我不知道进程的窗户什么,我只有进程ID,所以FindWindow没有帮助的.有没有其他方法可以找到进程的主窗口?
换句话说: 有没有办法像任务管理器点击" 结束任务 " 时那样优雅地终止任何进程?(而不是"结束过程")
我正在写一个bash脚本,它做了几件事.
最初它启动了几个监视器脚本,每个脚本都运行一些其他工具.
在我的主脚本结束时,我想杀死从我的shell中生成的所有东西.
所以,它可能看起来像这样:
#!/bin/bash
some_monitor1.sh &
some_monitor2.sh &
some_monitor3.sh &
do_some_work
...
kill_subprocesses
Run Code Online (Sandbox Code Playgroud)
问题是这些监视器中的大多数都会生成自己的子进程,所以这样做(例如):killall some_monitor1.sh并不总是有用.
还有其他办法可以处理这种情况吗?
我想获得某个Java进程的堆转储(可疑的内存泄漏).但是,当我启动jvisualvm工具时,我看不到任何正在运行的Java进程.
我已经谷歌了解了这一点,并且已经发现了一些文章说你必须使用与启动jvisualvm工具相同的JDK来运行Java进程,以便它能够看到它们.但是,据我所知,情况已经如此.我在本地做所有事情(我可以远程访问机器).
需要考虑的几件事:
java.exe我正在等待服务器的虚拟副本,所以我可以搞砸它(这是一个生产服务器).但与此同时; 关于为什么我在jvisualvm(或jconsole)中看不到任何进程的任何想法?
当我对dos执行以下命令时,它将正常工作
ffmpeg -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi
Run Code Online (Sandbox Code Playgroud)
当我尝试在c#中使用流程类而没有参数时,它会在控制台窗口中加载ffmpeg,然后像往常一样消失.但是,当我尝试使用上面的参数时,格式完全相同......它不起作用!ffmpeg仍然加载,但是由于控制台窗口关闭如此之快,我无法确定错误是什么:/
Process ffmpeg = new Process();
ffmpeg.StartInfo.FileName = path + "//" + "ffmpeg.exe";
ffmpeg.StartInfo.Arguments = " -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi";
ffmpeg.Start();
Run Code Online (Sandbox Code Playgroud)
谁知道为什么会这样?为什么命令可以从dos工作,然后使用c#无法工作,即使参数完全相同?我之前使用过这种方法很多东西,从来没有遇到过这种情况.
我使用本教程设置并配置了一个多节点Hadoop集群.
当我输入start-all.sh命令时,它会显示正确初始化的所有进程,如下所示:
starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-namenode-jawwadtest1.out
jawwadtest1: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-datanode-jawwadtest1.out
jawwadtest2: starting datanode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-datanode-jawwadtest2.out
jawwadtest1: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-secondarynamenode-jawwadtest1.out
starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-jobtracker-jawwadtest1.out
jawwadtest1: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-tasktracker-jawwadtest1.out
jawwadtest2: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-root-tasktracker-jawwadtest2.out
Run Code Online (Sandbox Code Playgroud)
但是,当我输入jps命令时,我得到以下输出:
31057 NameNode
4001 RunJar
6182 RunJar
31328 SecondaryNameNode
31411 JobTracker
32119 Jps
31560 TaskTracker
Run Code Online (Sandbox Code Playgroud)
如您所见,没有运行datanode进程.我尝试配置单节点群集但遇到了同样的问题.有人会知道这里可能出现什么问题吗?是否有任何配置文件未在教程中提及或我可能已查看过?我是Hadoop的新手,有点迷失,任何帮助都会非常感激.
编辑:hadoop-root-datanode-jawwadtest1.log:
STARTUP_MSG: args = []
STARTUP_MSG: version = 1.0.3
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/$
************************************************************/
2012-08-09 23:07:30,717 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loa$
2012-08-09 …Run Code Online (Sandbox Code Playgroud)