【kill】kill -9 杀不死的进程处理办法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【kill】kill -9 杀不死的进程处理办法相关的知识,希望对你有一定的参考价值。

参考技术A kill -9 发送SIGKILL信号给进程将其终止,但对于以下两种情况不适用:

1.该进程是僵尸进程(STAT z),此时进程已经释放所有的资源,但是没有被父进程释放。

僵尸进程要等到父进程结束,或者重启系统才可以被释放。

2.进程处于“内核态”,并且在等待不可获得的资源,处于“内核态 ”的资源默认忽略所有信号,只能重启系统解决。

进程在Linux 中会处于两种状态,即用户态和内核态。只有处于用户态的进程才可以用“kill”命令将其终止  

一般可以用top命令发现动态进程表,其中zombie是僵尸进程:

用ps和grep命令寻找僵尸进

# ps -A -o  stat,ppid,pid,cmd

#  ps  -A  -o  stat,ppid,pid,cmd | grep -e  '^[Zz]'

命令注解:

-A 参数列出所有进程

-o 自定义输出字段 

我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数 因为状态为 z或者Z的进程为僵尸进程。

我们使用grep抓取stat状态为zZ进程,使用 kill  -HUP $pid 来杀掉这个僵尸进程。

如何kill一个App进程

杀死自己的进程:

1.

android.os.Process.killProcess(android.os.Process.myPid());


2.
System.exit(0);

杀死别人的进程:


1.参数是目标应用的包名,需要权限,但这个方法有时杀不死进程,正确的说是进程被杀死后,又重新启动了,真正杀死进程我推选第二种方法


<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses("com.android.mms");

 

2.说起来也郁闷,公司开发刚好遇到这个问题,摸索了好久才找到如下解决方法,需要root权限

public void killApp2(Context context, String packageName) 
	String command = "am force-stop " + packageName + "\\n";
	sendShell(command);


public static String sendShell(String command) 
		Process proc = null;
		DataOutputStream os = null;
		BufferedReader in = null;
		InputStream error = null;
		InputStream input = null;
		try 
			Runtime runtime = Runtime.getRuntime();
			proc = runtime.exec("su\\n");
			String line = "";
			os = new DataOutputStream(proc.getOutputStream());
			os.write((command + "\\n").getBytes());
			os.writeBytes("exit\\n");
			os.flush();
			proc.waitFor();
			// 拿到输出流,开始读取
			input = proc.getInputStream();
			error = proc.getErrorStream();
			int length = input.available();
			int errorLength = error.available();
			if (length > 0 && errorLength == 0) 
				// 执行正确
				in = new BufferedReader(new InputStreamReader(input));
				StringBuffer stringBuffer = new StringBuffer();
				while ((line = in.readLine()) != null) 
					stringBuffer.append(line + "\\n");
					System.out.println("line:" + line);
				
				line = stringBuffer.toString();
			
			return line;
		 catch (Exception ex) 
			ex.printStackTrace();
		 finally 
			try 
				if (os != null) 
					os.close();
				
				if (in != null) 
					in.close();
				
				if (error != null) 
					error.close();
				
				if (input != null) 
					input.close();
				
				if (proc != null) 
					proc.destroy();
				
			 catch (IOException e) 
				e.printStackTrace();
			
		
		return null;
	



以上是关于【kill】kill -9 杀不死的进程处理办法的主要内容,如果未能解决你的问题,请参考以下文章

如何kill一个App进程

如何kill一个App进程

为啥会有个kill进程?还杀不掉?

android实用软件tasker应用设置

linux系统下病毒排除思路

如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之