我有杀死子进程的问题.以下代码用于创建子流程 -
while(not myQueue.empty()):
p=Popen(myQueue.get(),shell=True,stdin=PIPE,stderr=PIPE)
Run Code Online (Sandbox Code Playgroud)
我通过迭代创建进程,直到队列(其中包含命令)为空.变量p是全局变量,是Popen类型的对象.即使命令完成了它应该做的事情,我也遇到了停止按钮的问题,这并没有像我预期的那样停止进程.
停止按钮代码如下 -
stop=Button(textBoxFrame,text="Stop",width=5,command=stopAll)
stop.grid(row=1,column=4)
Run Code Online (Sandbox Code Playgroud)
stopAll方法由上面的停止按钮调用,该按钮将终止当前子进程p.
def stopAll():
p.kill()
Run Code Online (Sandbox Code Playgroud)
注意 - 没有错误,例外或任何编译问题.
更新:
问题是p.kill()没有杀死我需要杀死的进程.我使用unix检查了这个>> ps aux.我也让我的程序输出启动和终止PID,以便我可以检查它们ps aux.我发现我需要杀死的进程是6个PID p.pid,我试图杀死os.kill((p.pid)+6,signal.SIGKILL)正在运行的进程并停止正确的进程.但我不想以这种方式做,因为有可能导致不同的子进程被杀死.我正在提供有关我的问题的更多细节 -
我在这里使用的队列包含我之前说过的命令.命令是这样的 -
echo "Hello"|festival --tts
Run Code Online (Sandbox Code Playgroud)
Festival是unix中的语音合成器,festival --tts可以从文件中获取用户输入.我正在"Hello"为节日做准备,它正确地说出了这些话.但是p执行上述命令的过程是杀戮echo而不是festival.所以请帮我杀死特定的(节日)过程.
我的程序需要杀死一个特定的应用程序.是否可以在股票,无根设备上?如果是 - 如何?我知道它的进程名称和PID.
我有一个测验应用程序,它有一个计时器用于整个游戏活动,你应该在指定的分钟内回答尽可能多的问题.
在指定的分钟结束后,它将带您进入显示您的分数的结果活动.在背面按下时,我创建了一个警告对话框,询问您是否要返回主菜单.如果单击是,则页面应返回主菜单并停止/终止游戏活动.
但是,当我单击"是"时,它将返回主菜单,但当您仍然在应用程序的任何位置时,结果仍将显示我之前的游戏活动.也许我还没有真正完成游戏活动,..这是我的活动中的计时器和背压片段:
new CountDownTimer(seconds, 1000) {
public void onTick(long millisUntilFinished) {
timer.setText("Seconds left: " + millisUntilFinished / 1000);
}
public void onFinish() {
Intent intent = new Intent(GameActivityAddition.this, Score.class);
intent.putExtra("totalscore", score);
intent.putExtra("numberquestions", rowId);
intent.putExtra("d", difficulty);
db.close();
startActivity(intent);
}
}.start();
@Override
public void onBackPressed() {
AlertDialog.Builder abuilder = new Builder(GameActivityAddition.this);
abuilder.setMessage("Return to Main Menu?");
abuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent main = new Intent(GameActivityAddition.this, Main.class);
startActivity(main);
finish();
}
});
abuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public …Run Code Online (Sandbox Code Playgroud) 所以我最近了解到kill不是同步命令,所以我在bash中使用while循环,这很棒:
while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
但是,有些情况(非常罕见,但它们仍然会发生),其中进程被卡住,并且它不会对kill信号起作用.在这些情况下,杀死应用程序的唯一方法是使用" kill -9 ".
所以我想知道,如果循环已达到第10次迭代,如何在bash中修改上面的while循环以使用-9参数?
我想知道是否有一个钩子可以在Linux内核模块中使用,当用户空间应用程序/进程被杀死时会被触发?
我正在编写一个shell脚本,其中我有父进程,并且它具有由sleep &命令创建的子进程.现在我想杀死父进程,以便子进程也将被杀死.我能用以下命令做到这一点:
trap "kill $$" SIGINT
trap 'kill -HUP 0' EXIT
trap 'kill $(jobs -p)' EXIT
Run Code Online (Sandbox Code Playgroud)
这些命令正在使用kill [parent_process_ID]命令但如果我使用kill -9 [parent_process_ID]那么只有父进程将被终止.请进一步指导我实现此功能,以便当我使用任何命令终止父进程时,也应该杀死子进程.
我有一个应用程序,其工作是启动和停止各种其他进程.
问题是Qt应用程序不能完全停止.Qt窗口关闭,但进程仍然在后台运行,直到调用TerminateProcess(),然后Qt应用程序退出而不进行清理.
我正在使用Microsoft概述的这种方法.甚至Qt源也使用该方法来终止进程,除了它们还将WM_CLOSE发布到主线程.我已将其添加到我的应用程序中,但它仍然只是关闭窗口,离开了该过程.
我觉得有趣的是,如果我使用Windows任务管理器来"结束任务"(不是"结束进程"),窗口关闭,进程也结束,所以我知道这是可能的.如果我使用spy ++我可以看到主窗口和主线程都从任务管理器和我的应用程序接收WM_CLOSE消息,但只有使用任务管理器,消息继续到WM_DESTROY,WM_NCDESTROY等,最后结束进程结束.这个问题只发生在Qt应用程序中.Win32/MFC等应用程序使用我的应用程序干净地终止.
你应该如何干净地关闭Qt应用程序(假设Qt应用程序源不可用)?
- - - - 编辑 - - - -
这里有一些示例代码可以重现问题.至少,我有兴趣知道其他人是否看到了我所看到的同样问题.
示例代码启动CMake(此处下载),但任何Qt应用都应该这样做.
#include <Windows.h>
#include <iostream>
BOOL CALLBACK TerminateAppEnum(HWND hwnd, LPARAM pid);
int _tmain(int argc, _TCHAR* argv[])
{
char* processName = "C:\\Program Files (x86)\\CMake\\bin\\cmake-gui.exe";
//char* processName = "C:\\Windows\\Notepad.exe";
std::cout << "Creating process \"" << processName << "\"" << std::endl;
STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi = {0};
BOOL success = CreateProcess(processName,
"",
NULL,
NULL, …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
foreach (var process in Process.GetProcessesByName(name))
{
try
{
process.Kill();
if (!process.WaitForExit(timeout))
{
session.Log("Killing process {0} timed out.", name);
}
else
{
session.Log("Killing process {0} finished successfully.", name);
}
}
catch (Exception exception)
{
session.Log("Exception while trying to kill process {0}: {1}", name, exception.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
Process.Kill抛出以下异常:
Exception while trying to kill process <process name>: System.ComponentModel.Win32Exception (0x80004005): Access is denied
at System.Diagnostics.Process.Kill()
at CustomActions.CustomActions.KillAllProcesses(String name, Session session, Nullable`1 wait)
Run Code Online (Sandbox Code Playgroud)
代码通常有效,但奇怪的是它失败了.它是我构建的安装程序的自定义操作的一部分,当它运行时,它在本地系统帐户下运行.我在过去看过Process.Kill会发生这种情况.我知道有一些替代品.我不能修改有问题的过程的代码,所以我自己终止它,但我觉得合适.如果我不关心将它留在某个中间状态,因为我正在从系统中卸载它的文件,那么最好的方法来预防需要尽快死掉的进程?如果在全局级别为应用程序设置任何设置并且用户进行升级,则应允许任何IO完成或取消.P/Invoking TerminateProcess是最好的解决方案吗?
androids DownloadManager是否有对应版本?我想开始上传文件,并且当应用被终止时,上传应该继续。它应该提供类似的可能性,例如设置标题,进度通知,通知中心集成等。
我找到了https://github.com/alexbbb/android-upload-service,但它使用的是ServiceIntent。因此,当应用被终止时,它将停止工作。还是我理解不对?
如果没有对手:编写独立于应用程序状态运行的后台服务的最佳方法是什么?我看过Services,AsyncTask,ServiceIntent,但是当应用程序死后,所有这些都将停止!
service android background-service kill-process asyncfileupload
我有一个批处理文件,必须启动Internet Explorer并打开www.google.com.当整个页面加载完成时,它应该终止IE进程,即关闭该系统中IE的所有实例.我的批处理文件有以下两行.
iexplore.exe "www.google.com"
taskkill /IM iexplore.exe /F
Run Code Online (Sandbox Code Playgroud)
但是在加载后它没有关闭IE实例.
如果我有单独的taskkill/IM iexplore.exe/F单独的批处理文件.此批处理文件关闭IE实例.
First Batch文件出了什么问题.
PS批处理文件位于程序文件的Internet Explorer文件夹中.