我想在vista/windows 7中以编程方式杀死一个进程(我不确定两者之间的UAC实现是否存在重大问题以产生影响).
现在,我的代码看起来像:
if(killProcess){
System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("MyProcessName");
// Before starting the new process make sure no other MyProcessName is running.
foreach (System.Diagnostics.Process p in process)
{
p.Kill();
}
myProcess = System.Diagnostics.Process.Start(psi);
}
Run Code Online (Sandbox Code Playgroud)
我必须这样做,因为我需要确保如果用户崩溃程序或突然退出,则在重新启动应用程序时重新启动此辅助进程,或者如果用户想要更改此辅助进程的参数.
该代码在XP中运行良好,但在Windows 7(我假设在Vista中)失败时出现"访问被拒绝"消息.从全能的Google告诉我的内容来看,我需要以管理员的身份运行我的杀戮程序以解决这个问题,但这只是一个弱点.另一个可能的答案是使用LinkDemand,但我不理解LinkDemand的msdn页面,因为它与进程有关.
我可以将代码移动到一个线程中,但是它有许多固有的其他困难,我真的不想发现它.
我想知道在杀死在不同线程中启动的子进程时是否可以关闭通信管道.如果我不调用communic(),那么kill()将按预期工作,在一秒钟而不是五秒后终止进程.
我在这里找到了一个类似问题的讨论,但我没有得到真正的答案.我假设我要么必须能够关闭管道,要么明确地杀死子子进程(在示例中为"sleep")并杀死它以取消阻塞管道.
我也试着在SO上找到她的答案,但是我只发现了这个以及这个,而且这个并没有直接解决这个问题,据我所知(?).
所以我想要做的是能够在第二个线程中运行命令并获取其所有输出,但是当我愿意时能够立即杀死它.我可以通过一个文件和尾巴那个或类似的,但我认为应该有一个更好的方法来做到这一点?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
Run Code Online (Sandbox Code Playgroud)
这是脚本:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
Run Code Online (Sandbox Code Playgroud)
产量
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud) 亲爱的多线程/ Java/C/JNI专家,
我有一个稍微具体的问题.我有一个生成线程的Java程序.在run()方法中,调用C(通过JNI),首先,在TLS中分配线程局部变量,然后输入event_loop(因此线程的默认生存期由此循环确定) .
我现在的问题是如果发生类似SIGSEGV的事情,如何能够关闭/终止线程.重要的是整个过程和其中的其他线程可以继续.这就是我们使用TLS分离线程的原因.
(我知道,有些人不鼓励这样做,当然做防御性编程是正确的,试图提前避免这种崩溃.这段代码仅用于迁移期,因为我们正在从C更改为Java.但是这由于我们拥有的资源很少,所以需要一些时间.)
class MyThread extends Thread {
run() {
//wrapping the following with try-catch and throwing exception in signal
//handler on C side possible?
callNativeCFunction(); //allocates TLS, enters event_loop()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用signal.h,我的信号处理程序是否会在线程上下文中调用?我可以访问TLS变量吗?我可以通过env指针以某种方式通过JVM抛出一个异常来打破run()吗?或者我可以在Java线程上调用interrupt(),例如在Bruce Eckel的书中提到的(见下文).
最后,还有一个问题:SIGSEGV是Posix世界,STATUS_ACCESS_VIOLATION是Windows世界.当我在Windows中的C代码中尝试以下内容时:
char *s = "hello world";
*s = 'H';
Run Code Online (Sandbox Code Playgroud)
我没有得到SIGSEGV,(但我猜是STATUS_ACCESS_VIOLATION).由于我使用的是signal.h,因此我只能处理一组非常有限的信号.你知道我怎么能处理上述情况吗?
或者我会更好地使用C端的pthreads并在信号处理程序中调用pthread_exit()(从下面的第一个链接获取的想法)?
那是我的问题.我会非常感谢任何帮助.提前谢谢了.
有用的线索;)我发现:
首先有一点背景 - 当我apt-get install从我公司的互联网上下载时,它会在前10秒左右提供高速(400-500KB/s),然后下降到十分之一(40-50KB/s),然后几分钟后真正悲惨(4-5KB/s).这让我觉得系统管理员已经实现了某种网络限制方案.
现在我知道网络不是简单的不稳定,因为如果我开始apt-get install foo,Ctrl-C它会在10秒后立即apt-get install foo再次运行(通过向上箭头并输入以使用bash历史记录),然后继续重复此过程几分钟直到所有包都下载了,我甚至可以非常快速地下载大包.特别是,即使在使用Ctrl-C中止下载后,apt-get似乎也能够在下次调用时恢复下载.
当然,盯着屏幕每隔10秒做一次Ctrl-C Up Enter真的很快,所以我写了一个shell脚本 -
#!/bin/sh
for i in `seq 1 100` ; do
sudo apt-get install foo -y &
sleep 10
sudo kill -2 $!
done
Run Code Online (Sandbox Code Playgroud)
这似乎有效.它产生apt-get,运行10秒然后杀死(通过发送SIGINT)并再次启动它.但是,它并没有真正起作用,因为现在apt-get不会在后续调用中恢复下载!
我sudo apt-get install foo从一个终端运行然后kill -2 <PID of apt-get>从另一个终端运行的实验.即使在这种情况下,当我重新启动apt-get时,它也不会恢复下载.
很明显,Ctrl-C 不等同于SIGINT.当我手动执行Ctrl-C时会发生其他事情,这会让apt-get有机会保存下载状态.问题是 - 它是什么?
编辑
这些是我到目前为止收到的建议,但没有雪茄.神秘加深了! -
在sudo kill -2 $!该信号可能会sudo代替apt-get.这不是原因,因为如上所述我也尝试将SIGINT专门发送到apt-get的PID,甚至阻止apt-get保存其状态.
Sudo捕获信号并向apt-get发送一些其他信号.我试着发送apt-get所有我能想到的信号!它仍然没有恢复其中任何一个的下载.它只在我执行Ctrl-C杀死它时才恢复下载.
如果来自脚本而不是交互式shell,则Apt-get处理SIGINT的方式不同.再次,上面的"实验"证明这不是真的.
如果我SIGTERM使用该kill命令向进程发送信号,我期望退出代码,但在终止进程后运行以下命令时总是得到0(零):
echo $?
Run Code Online (Sandbox Code Playgroud)
根据这篇文章中的答案,我在发送SIGTERM一个进程时应该得到143 :始终应用Java结束"退出143"Ubuntu
但我没有得到退出代码.为什么?
我必须2处理excel.例如:
1)example1.xlsx 2)example2.xlsx
如何杀死第一个"example1.xlsx"?
我用这个代码:
foreach (Process clsProcess in Process.GetProcesses())
if (clsProcess.ProcessName.Equals("EXCEL")) //Process Excel?
clsProcess.Kill();
Run Code Online (Sandbox Code Playgroud)
那杀了两个.我想杀一个......谢谢.
嗨我有这个进程树:

上面的屏幕截图显示了一个进程树.在我的Perl脚本中,我知道dscli的PID.我编写了以下代码来杀死单个PID:
use Win32::Process;
use strict;
use warnings;
if(defined($ARGV[0])){
my $pid = "$ARGV[0]";
my $exitcode = 0;
Win32::Process::KillProcess($pid, $exitcode);
}else{
print "No argument provided :(\n";
}
Run Code Online (Sandbox Code Playgroud)
问题是在我的脚本中我不知道java进程的PID.我必须得到dscli的子PID,这是java进程.如果我使用上面的代码杀死dscli的PID,那么子(java)不会死掉它.
所以我的问题是,如何使用perl杀死dscli的子进程java进程?
假设这是一台Windows 7机器 - 我们正在谈论Windows命令行上的批处理脚本.
想象一下,我想启动和停止在后台运行的两个不同进程,并在后台运行时运行.例如:
START /B CMD /C tomcatA.bat
doSomeStuff
stopTomcatACmd
START /B CMD /C tomcatB.bat
doSomeStuff
stopTomcatBCmd
Run Code Online (Sandbox Code Playgroud)
我正在试图弄清楚如何实现stopTomcatBCmd.在Linux计算机上你可以只kill的pid.
我的问题是:如何杀死Windows中后台运行的特定进程?
美好的一天,我有一个运行特定应用程序的.bat文件,然后在5秒后关闭/杀死它.
我现在因为它在应用程序打开时成功打开应用程序,它将不会执行剩余的命令,除非我手动关闭应用程序.
这是我的代码:
cd "C:\Program Files (x86)\Aspera\Point-to-Point\bin\"
asperascp.exe
sleep 5
taskkill /IM asperascp.exe /f
Run Code Online (Sandbox Code Playgroud)
我也尝试删除sleep命令.
cd "C:\Program Files (x86)\Aspera\Point-to-Point\bin\"
asperascp.exe
taskkill /IM asperascp.exe /f
Run Code Online (Sandbox Code Playgroud)
但它会有相同的输出,当asperascp.exe启动时它不会执行剩余的命令.
有小费吗?
谢谢.
我有以下 Gradle 任务
task bootup(type: JavaExec) {
dependsOn build
classpath = sourceSets.main.runtimeClasspath
main = 'org.example.ServerLauncher'
args 'hello'
maxHeapSize '512m'
}
Run Code Online (Sandbox Code Playgroud)
班级ServerLauncher.java是
task bootup(type: JavaExec) {
dependsOn build
classpath = sourceSets.main.runtimeClasspath
main = 'org.example.ServerLauncher'
args 'hello'
maxHeapSize '512m'
}
Run Code Online (Sandbox Code Playgroud)
当我构建 Jar./gradlew jar并java -jar /path/to/exec在 CLI 中运行时,我可以使用CTRL+C.
Launcher has started
^CShutdown has triggered
Launcher has closed
Run Code Online (Sandbox Code Playgroud)
但如果我运行,./gradlew bootup我将无法正常关闭可执行文件CTRL+C
> Task :bootup
Launcher has started
<===========--> 91% EXECUTING [8s]
> :bootup
^C% …Run Code Online (Sandbox Code Playgroud)