是否有必要在Process.Kill之后使用Process.WaitForExit?
如果调用进程在调用Process.Kill后立即退出怎么办?
这会导致Process.Kill失败吗?
编辑:我需要在退出应用程序时终止进程.此时我不打算处理kill失败的情况,因此我没有必要等待进程退出.因此,如果不需要调用WaitForExit,我可以跳过它.
我正在执行以下代码:
ActivityManager actvityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<RunningTaskInfo> procInfos = actvityManager.getRunningTasks(1000);
Run Code Online (Sandbox Code Playgroud)
然后,我杀了一个我感兴趣的过程
actvityManager.killBackgroundProcesses(process.baseActivity.getPackageName());
Run Code Online (Sandbox Code Playgroud)
哪里process是一个条目procInfos.
问题是如果我getRunningTasks再次运行- 它仍会显示我(可能)被杀死的进程,而Android的任务管理器在调用之前列出了该进程killBackgroundProcesses并在该调用之后将其从列表中删除.
那么,关于任务管理器如何获得正在运行的进程列表的任何想法?在无根设备上成功杀死第三方进程是正常的吗?
有没有办法杀死让孩子进程“自杀”?我尝试过,process.exit(1)但显然它会杀死我正在运行的整个应用程序。我只想杀死子进程(就像我们process.kill()从子进程的“父亲”调用一样)。process.kill()在子进程中调用也会杀死整个应用程序。
任何的想法?
在我的java应用程序中我使用
Runtime.getRuntime().exec("taskkill /F /IM " + explorer.exe).waitFor();
Run Code Online (Sandbox Code Playgroud)
关闭Windows资源管理器.这部分有效,因为Explorer真的停止为我工作.
不幸的是,当我使用时
Runtime.getRuntime().exec("explorer.exe");
Run Code Online (Sandbox Code Playgroud)
Windows资源管理器根本不重新启动.我该如何正确重启?
在我的应用程序中,当用户按下HOME键并在一段时间后返回应用程序时,我的应用程序在各种位置和活动上提供NullPointerExceptions.我知道我的应用程序被操作系统杀死以释放一些资源.现在我希望当用户再次回到应用程序并且应用程序先前被杀死时,我怎么能检测到我的应用程序被杀死以便我可以重新加载不同的资源?
我有一个 android 活动问题。
这是我的流程的工作原理:
Login Activity 开始MainMenuActivity开始,LoginActivity 由我完成。MainMenuActivity没有完成。因为它是主菜单。当用户在设置屏幕上按下返回时,我需要返回MainMenuActivity。所以我不能杀MainMenu。SettingsActivity并由我完成并开始登录活动。当用户返回登录时,我需要杀死MainMenuActivity但我不能。:/FLAG_ACTIVITY_SINGLE_TOP,CLEAR_TOP,SINGLE_TASK,NEW_TASK,NO_HISTORY等几乎所有的人没有工作launchMode="singleTask",clearTaskOnLaunh="true"等没有再工作。addFlags()与setFlags()这两个,没有工作请问有人可以帮忙吗?
PS android:minSdkVersion="8"和android:targetSdkVersion="15"我的应用程序。我没有在应用程序中使用片段,我使用旧的活动结构。
我有一个activity和一个应用程序service.如果我在运行的activity同时杀死service它也会被杀死.对我来说,服务不会被杀死是非常重要的.如何使当系统杀死(或者我通过清除"最近的应用程序"列表杀吧)activity的service仍然有效,直到它完成它的工作?提前致谢!
我创建了一个gulpfile.js启动我的服务器,其内容可以在下面看到.
gulp.task('default', function () {
if(!fs.statSync('/etc/aptly.conf').isFile()){
process.exit();
return;
}
console.info('Starting static file server SimpleHTTPServer on 0.0.0.0:8080');
aptly_static = spawn('python', ['-m', 'SimpleHTTPServer', '8080'], {'cwd': '/opt/aptly/public', 'stdio': 'inherit'});
console.info('Starting Django runserver on 0.0.0.0:8000');
django = spawn('python', ['manage.py', 'runserver', '0.0.0.0:8000'], {'stdio': 'inherit'});
console.info('Starting Aptly api serve on 0.0.0.0:4416');
aptly_api = run('aptly api serve -listen="0.0.0.0:4416"').exec().pipe(gulp.dest('/tmp/aptlylog'));
return watchLess('src/**/*.less')
.pipe(debug())
.pipe(reLess)
.pipe(gulp.dest('dist/dist'));
Run Code Online (Sandbox Code Playgroud)
问题是如果由于任何原因导致较少的预处理器崩溃,gulpfile.js守护程序退出的很差.子进程python manage.py runserver python -m SimpleHTTPServer aptly api serve仍将运行.
我不得不通过使用ps -aux | grep runserver类似的方法来煞费苦心地终止这些,以找到要删除的PID sudo kill -9 $PID …
是什么启动一个新的进程与这两个选项之间的区别subprocess.Popen为python3.2+下Linux:
proc = subprocess.Popen(args, ..., preexec_fn=os.setsid) # 1
proc = subprocess.Popen(args, ..., start_new_session=True) # 2
Run Code Online (Sandbox Code Playgroud)
我需要这个,因为我需要设置进程组ID,以便有可能立即杀死该进程及其所有子进程。然后,如果流程运行时间超过特定阈值,则使用此方法:
try:
out, err = proc.communicate(timeout=time_max)
except subprocess.TimeoutExpired:
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
Run Code Online (Sandbox Code Playgroud)
我使用两个选项(#1&#2)测试了我的代码,它们对我来说似乎都可以正常工作。
但是我想知道这里最好的选择是什么-一个preexec_fn或一个start_new_session?
我一直在尝试找出如何启动不同的子流程实例,然后杀死它们然后创建新的实例。父python进程从不执行,只会杀死子进程。我在SO上跟踪了很多链接,但是一旦父python进程结束,我就会不断收到以下消息:
F/Users/Lucifer/miniconda3/envs/rltp/lib/python3.6/subprocess.py:761: ResourceWarning: subprocess 40909 is still running ResourceWarning, source=self)
Run Code Online (Sandbox Code Playgroud)
这似乎很有趣,因为我做到了,ps但是却一无所获:
PID TTY TIME CMD
7070 ttys001 0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Lucifer
7072 ttys001 0:00.61 -bash
17723 ttys002 0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp Lucifer
17725 ttys002 0:00.06 -bash
38586 ttys002 0:00.16 sertop --no_init
Run Code Online (Sandbox Code Playgroud)
我只想开始一个过程:
self.serapi = subprocess.Popen(['sertop','--no_init'],
stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,
preexec_fn=os.setsid,shell=True
,)
Run Code Online (Sandbox Code Playgroud)
并杀死它:
os.killpg(os.getpgid(self.serapi.pid), signal.SIGTERM)
Run Code Online (Sandbox Code Playgroud)
上面的代码本质上是从最上面的答案复制的:
但我不确定为什么会收到此消息。我是否成功终止了子进程?我计划启动并杀死其中许多人。
注意我不知道或不需要shell=True。我只是复制了那个,就是我发布的答案/问题的答案。我宁愿没有那个参数。
根据我尝试的答案:
def kill(self):
self.serapi.wait()
#self.serapi.kill()
self.serapi.terminate()
#os.killpg(os.getpgid(self.serapi.pid), signal.SIGTERM)
#self.serapi.wait()
Run Code Online (Sandbox Code Playgroud)
以及上述内容的不同排列方式,但似乎没有任何效果。有什么建议吗?