精华内容
下载资源
问答
  • //在此处我是根据获取进程名称来杀掉360se.exe这个进程的,你们可以按照你们得需求来写,按照进程名称或进程id来杀进程 if(taskName[i].contains("360se.exe")) { count++;//用于进程计数 } } //当进程数大于等于2...

    咱们开门见山,代码如下,如有更好的办法,可以多多指教哦。。。。

    import java.io.BufferedReader;

    import java.io.IOException;

    import java.io.InputStreamReader;

    import java.util.ArrayList;

    import java.util.List;

    /**

    *

    * @author syp

    *

    */

    public class KillProcess{

    public static void main(String[] args) throws InterruptedException {

    /*

    * 下面先是获取进程列表

    */

    Runtime runtime = Runtime.getRuntime();

    List tasklist = new ArrayList();

    try {

    Process process = runtime.exec("tasklist");

    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String s = "";

    while ((s = br.readLine()) != null) {

    if ("".equals(s)) {

    continue;

    }

    tasklist.add(s+" ");

    }

    // 获取每列最长的长度

    String maxRow = tasklist.get(1) + "";

    String[] maxCol = maxRow.split(" ");

    // 定义映像名称数组

    String[] taskName = new String[tasklist.size()];

    // 定义 PID数组

    String[] taskPid = new String[tasklist.size()];

    // 会话名数组

    String[] taskSessionName = new String[tasklist.size()];

    // 会话#数组

    String[] taskSession = new String[tasklist.size()];

    // 内存使用 数组

    String[] taskNec = new String[tasklist.size()];

    for (int i = 0; i < tasklist.size(); i++) {

    String data = tasklist.get(i) + "";

    for (int j = 0; j < maxCol.length; j++) {

    switch (j) {

    case 0:

    taskName[i]=data.substring(0, maxCol[j].length()+1);

    data=data.substring(maxCol[j].length()+1);

    break;

    case 1:

    taskPid[i]=data.substring(0, maxCol[j].length()+1);

    data=data.substring(maxCol[j].length()+1);

    break;

    case 2:

    taskSessionName[i]=data.substring(0, maxCol[j].length()+1);

    data=data.substring(maxCol[j].length()+1);

    break;

    case 3:

    taskSession[i]=data.substring(0, maxCol[j].length()+1);

    data=data.substring(maxCol[j].length()+1);

    break;

    case 4:

    taskNec[i]=data;

    break;

    }

    }

    }

    int count=0;

    for (int i = 0; i < taskNec.length; i++) {

    //打印进程列表

    //System.out.println(taskName[i]+" "+taskPid[i]+" "+taskSessionName[i]+" "+taskSession[i]+" "+taskNec[i]);

    //在此处我是根据获取进程名称来杀掉360se.exe这个进程的,你们可以按照你们得需求来写,按照进程名称或进程id来杀进程

    if(taskName[i].contains("360se.exe")) {

    count++;//用于进程计数

    }

    }

    //当进程数大于等于2个以上时,要求杀掉

    if(count>=2) {

    Process p = null;

    try {

    //此处需要填写你要杀掉的进程名称

    runtime.exec("cmd.exe /C start wmic process where name='360se.exe' call terminate");

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    以上代码,包含了获取进程列表及进程id,进程名称,进程内存使用,等杀完进程后可以在dos下验证,也可以打开资源管理器验证。

    1.打开dos步骤如下:

    1.win+R

    2.cmd

    3.输入tasklist

    效果图:

    bf7f56626eb3654eb2409f8f009875f1.png

    2.打开资源管理器

    Ctrl+Alt+Delete

    展开全文
  • Linux C程序修改进程名称

    千次阅读 多人点赞 2021-05-12 22:13:26
    Linux C程序修改进程名称(通过修改argv[0])1、前言2、命令行参数(argc, argv)以及环境变量(environ)介绍2.1、C程序典型的存储空间布局2.2、argc, argv介绍2.3、environ介绍2.4、编写程序验证修改进程名是否可以...

    1、前言

    Linux C程序运行时,进程的名称通常就是argv[0],而通过修改内存中argv[0]存储的内容就可以修改进程名了。下面对此作详细介绍。

    2、命令行参数(argc, argv)以及环境变量(environ)介绍

    2.1、C程序典型的存储空间布局

    如图所示,是C程序典型的存储空间布局,可以很明显看到命令行参数环境变量处在最顶端,而且是挨在一起的,命令行参数后面紧接着就是环境变量,具体的内容大家可以自行看一下《UNIX环境高级编程》第七章,下图也是从里面摘录出来的
    在这里插入图片描述

    2.2、argc, argv介绍

    每个C语言程序都必须有一个称为main的函数,一般形式为int main(int argc, char* argc[]),改函数作为程序启动的起点。执行程序时,命令行参数通过argcargv这两个两个入参传递给main函数。第一个表示命令行参数的个数,而第二个参数则是一个指向命令行参数的指针数组,每一参数都是C类型字符串,以空字符\0结尾的,而最后一个参数argc[argv]则是一个空指针NULL。其中第一个字符串(argv[0]),则是该程序的名称,也就是运行时的进程名。

    内存示例如图所示
    在这里插入图片描述

    2.3、environ介绍

    每一个进程都有与其相关的称为环境列表(environment list)的字符串数组。其中每个字符串都以名称=值(name=value)形式定义。新进程在创建时,会继承其父进程的环境副本,子进程创建后,父、子进程均可更改各自的环境变量,且这些变更对对方而言不再可见。
    在C程序中,可以使用全局变量extern char** environ获取环境变量表(C运行时启动代码定义了该变量并以当前环境列表位置为其赋值)environargv参数比较相似,是一个指针数组,数组每个成员指向C类型字符串,最后一个指针也是一个NULL

    内存示例如图所示
    在这里插入图片描述

    2.4、编写程序验证修改进程名是否可以成功

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc, char* argv[])
    {
        sleep(8);
        strcpy(argv[0], "112233445566");
        while (1);                                                                                                           
     
        return 0;
    }
    

    代码如上,可以看到,程序先休眠8秒钟,然后修改argv[0]的值,编译运行一下,运行结果如下,可以看到,一开始进程名是./all,8秒后就变成了112233445566,修改成功,而且我们也能看出一点细节,那就是修改后的进程名超过了原先的进程名也没有报错,有可能的原因是argc[0]后面的内存也是可用的(其实从内存布局就可以看出来可用了)
    在这里插入图片描述

    2.5、查看进程名变长之后影响了那部分内存的数据

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    
    extern char** environ;
    
    int main(int argc, char* argv[])
    {
        printf("begin environ:\n");
        for (int i = 0; environ[i] != NULL && i < 5; i++)
            printf("%s\n", environ[i]);
    
        sleep(5);
        strcpy(argv[0], "112233445566");
        printf("\n\n");
    
        printf("end environ:\n");
        for (int i = 0; environ[i] != NULL && i < 5; i++)
            printf("%s\n", environ[i]);
    
        return 0;
    }
    

    代码如上,为了方便显示,环境变量只打印前五个,看看效果就行。运行结果如下图所示,可以看到,一开始打印的第一个环境变量为XDG_SESSION_ID=3585,当修改完进程名之后,该变量变为445566,原先进程名为./all,加上结束符是6个字节,剩余四个字节的内容也就是445566刚好把第一个环境变量的内存给覆盖了(这里没有传入参数,所以覆盖的是环境变量的内存)。
    在这里插入图片描述

    2.6、结论

    Linux C程序中传入参数和环境变量是存放在一段连续的内存空间的,而argvenviron这两个指针数组里面存放的指针就是指向这些内存的

    3、Redis修改进程名的做法

    Redis作为一个优秀的企业级存储框架,里面有许多值得学习的地方,而里面也有一段代码修改进程名的,接下来看看Redis是如何实现的

    extern char **environ;
    
    static struct {
    	/* original value */
    	const char *arg0;
    
    	/* title space available */
    	char *base, *end;
    
    	 /* pointer to original nul character within base */
    	char *nul;
    
    	_Bool reset;
    	int error;
    } SPT;
    
    void spt_init(int argc, char *argv[]) {
        char **envp = environ;
    	char *base, *end, *nul, *tmp;
    	int i, error, envc;
    
    	if (!(base = argv[0]))
    		return;
    
    	nul = &base[strlen(base)];
    	end = nul + 1;
    
    	for (i = 0; i < argc || (i >= argc && argv[i]); i++) {
    		if (!argv[i] || argv[i] < end)
    			continue;
    
    		if (end >= argv[i] && end <= argv[i] + strlen(argv[i]))
    			end = argv[i] + strlen(argv[i]) + 1;
    	}
    
    	for (i = 0; envp[i]; i++) {
    		if (envp[i] < end)
    			continue;
    
    		if (end >= envp[i] && end <= envp[i] + strlen(envp[i]))
    			end = envp[i] + strlen(envp[i]) + 1;
    	}
    	envc = i;
    
    	if (!(SPT.arg0 = strdup(argv[0])))
    		goto syerr;
    
    	if (!(tmp = strdup(program_invocation_name)))
    		goto syerr;
    
    	program_invocation_name = tmp;
    
    	if (!(tmp = strdup(program_invocation_short_name)))
    		goto syerr;
    
    	program_invocation_short_name = tmp;
    
        /* Now make a full deep copy of the environment and argv[] */
    	if ((error = spt_copyenv(envc, envp)))
    		goto error;
    
    	if ((error = spt_copyargs(argc, argv)))
    		goto error;
    
    	SPT.nul  = nul;
    	SPT.base = base;
    	SPT.end  = end;
    
    	return;
    syerr:
    	error = errno;
    error:
    	SPT.error = error;
    }
    

    从代码中可以看出以下几点:

    1. base指向的是argv[0]nul指向argv[1],而end经过两个for循环遍历之后指向的是传入参数+环境变量内存空间的最末尾
    2. 使用strdup函数将原本的进程名复制给SPT.arg0
    3. spt_copyenvspt_copyargs函数的作用是将原先的传入参数(从argv[1]开始)和环境变量复制到一个新的内存区域,然后原先的指针数组里元素指向新的内存地址,完成了数据的迁移
    4. 经过上面的步骤之后,argv[0]还是指向原来的地址,而其他的传入参数以及环境变量均指向新的内存空间了,现在就可以任意修改进程名而不影响其他数据了

    4、总结

    本文介绍了如何修改Linux C程序的进程名,以及Redis源代码中是如何在保持原有传入参数以及环境变量的情况下,对程序的进程名进行修改。测试代码比较简单,大家可以自行编写程序去进行测试验证

    展开全文
  • 您有不同的选项可用于接收当前正在运行的进程的exe名称(如您所写的进程名称) . 最好的方法取决于您使用的编程语言和其他要求 . 例如,您可以使用WMI . 另一个更古老的方法是使用Performance Counters(另见An ...

    您有不同的选项可用于接收当前正在运行的进程的exe名称(如您所写的进程名称) . 最好的方法取决于您使用的编程语言和其他要求 . 例如,您可以使用WMI . 另一个更古老的方法是使用Performance Counters(另见An Introduction To Performance Counters) . 要获取计数器值,您只需使用 HKEY_PERFORMANCE_DATA 基本键中的注册表查询操作(请参阅Retrieving Counter Data)

    还可以使用的另一种方法是NtQuerySystemInformation函数,其中 SystemProcessInformation 作为参数 . EnumProcess 和许多其他Windows API在内部使用该功能 . NtQuerySystemInformation文档中定义的struct SYSTEM_PROCESS_INFORMATION 有很多"undocumented"但是多年以来众所周知的领域 . 如果您在Internet上搜索结构的定义,则将对完整文档进行罚款 . 我不知道功能帽状态没有完整记录 . 该功能至少在NT 3.5中(可能也在之前),现在可以很好地用于Windows 7 32位或64位 . 确切地说,你会发现一个小的C测试程序,它打印所有进程id与相应的exe名称(不是完整的exe路径,只是文件名):

    #include

    // one can also use Winternl.h if needed

    //#include // for UNICODE_STRING and SYSTEM_INFORMATION_CLASS

    #include

    #include

    #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)

    #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)

    typedef enum _SYSTEM_INFORMATION_CLASS {

    SystemProcessInformation = 5

    } SYSTEM_INFORMATION_CLASS;

    typedef struct _UNICODE_STRING {

    USHORT Length;

    USHORT MaximumLength;

    PWSTR Buffer;

    } UNICODE_STRING;

    typedef LONG KPRIORITY; // Thread priority

    typedef struct _SYSTEM_PROCESS_INFORMATION_DETAILD {

    ULONG NextEntryOffset;

    ULONG NumberOfThreads;

    LARGE_INTEGER SpareLi1;

    LARGE_INTEGER SpareLi2;

    LARGE_INTEGER SpareLi3;

    LARGE_INTEGER CreateTime;

    LARGE_INTEGER UserTime;

    LARGE_INTEGER KernelTime;

    UNICODE_STRING ImageName;

    KPRIORITY BasePriority;

    HANDLE UniqueProcessId;

    ULONG InheritedFromUniqueProcessId;

    ULONG HandleCount;

    BYTE Reserved4[4];

    PVOID Reserved5[11];

    SIZE_T PeakPagefileUsage;

    SIZE_T PrivatePageCount;

    LARGE_INTEGER Reserved6[6];

    } SYSTEM_PROCESS_INFORMATION_DETAILD, *PSYSTEM_PROCESS_INFORMATION_DETAILD;

    typedef NTSTATUS (WINAPI *PFN_NT_QUERY_SYSTEM_INFORMATION)(

    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,

    IN OUT PVOID SystemInformation,

    IN ULONG SystemInformationLength,

    OUT OPTIONAL PULONG ReturnLength

    );

    int main()

    {

    size_t bufferSize = 102400;

    PSYSTEM_PROCESS_INFORMATION_DETAILD pspid=

    (PSYSTEM_PROCESS_INFORMATION_DETAILD) malloc (bufferSize);

    ULONG ReturnLength;

    PFN_NT_QUERY_SYSTEM_INFORMATION pfnNtQuerySystemInformation = (PFN_NT_QUERY_SYSTEM_INFORMATION)

    GetProcAddress (GetModuleHandle(TEXT("ntdll.dll")), "NtQuerySystemInformation");

    NTSTATUS status;

    while (TRUE) {

    status = pfnNtQuerySystemInformation (SystemProcessInformation, (PVOID)pspid,

    bufferSize, &ReturnLength);

    if (status == STATUS_SUCCESS)

    break;

    else if (status != STATUS_INFO_LENGTH_MISMATCH) { // 0xC0000004L

    _tprintf (TEXT("ERROR 0x%X\n"), status);

    return 1; // error

    }

    bufferSize *= 2;

    pspid = (PSYSTEM_PROCESS_INFORMATION_DETAILD) realloc ((PVOID)pspid, bufferSize);

    }

    for (;;

    pspid=(PSYSTEM_PROCESS_INFORMATION_DETAILD)(pspid->NextEntryOffset + (PBYTE)pspid)) {

    _tprintf (TEXT("ProcessId: %d, ImageFileName: %ls\n"), pspid->UniqueProcessId,

    (pspid->ImageName.Length && pspid->ImageName.Buffer)? pspid->ImageName.Buffer: L"");

    if (pspid->NextEntryOffset == 0) break;

    }

    return 0;

    }

    展开全文
  • ps -ef | grep keyword | grep -v grep | awk '{print $2}' | xargs kill -9逐个分析:1, ps -ef | grep keyword: 查出进程名含有keyword 的所有进程;2, grep -v grep: 从这些结果里面,把含有 grep 的关键词的进程...

    ps -ef | grep keyword | grep -v grep | awk '{print $2}' | xargs kill -9

    逐个分析:

    1, ps -ef | grep keyword: 查出进程名含有 keyword 的所有进程;

    2, grep -v grep: 从这些结果里面,把含有 grep 的关键词的进程去除掉, -v 就是去除的意思;

    3, awk 'print $2': 就是将结果的第二列的信息打印出来;

    4, xargs kill -9: xargs是将它前面命令的结果作为参数,传递给xargs后面的命令。

    我们来看看前面的命令的第二列会输出什么信息。

    ps -ef | grep php-fpm | grep -v grep

    root 1625 1 0 10月11 ? 00:00:16 php-fpm: master process (/etc/php/5.6/fpm/php-fpm.conf)

    www-data 2096 1625 0 10月11 ? 00:00:00 php-fpm: pool www

    www-data 2098 1625 0 10月11 ? 00:00:00 php-fpm: pool www

    从左到右的字段分别是

    UID       PID       PPID      C     STIME    TTY       TIME         CMD

    UID      :程序被该 UID 所拥有

    PID      :就是这个程序的 ID

    PPID    :则是其上级父程序的ID

    C          :CPU使用的资源百分比

    STIME :系统启动时间

    TTY     :登入者的终端机位置

    TIME   :使用掉的CPU时间。

    CMD   :所下达的是什么指令

    第二列就是PID,进程ID。

    kill -9就是强制杀死,后面的参数就是PID。

    这就是一个根据进程名称杀死进程的Linux命令。

    展开全文
  • 前几天网上搜索如何更改执行进程的进程名称,并没有得到一个好的答案.刚刚阅读nginx的源码,发现这样一种解决方案,记录之:网上说的比较多的是直接更改argv[0],但是如上图中所示,nginx中指出,必须将argv[1]置为...
  • linux获取进程id和进程名称作为一个共享库,应该需要统计使用本库的各种应用程序的使用频率,使用方法等信息。才能针对主要应用做出更好的改进。www.2cto.com那么就需要记录调用者的进程id或者进程名称,并且保存...
  • 在Linux系统中经常会遇到...下文提供的脚本可以结束与指定的进程名称相匹配的任意进程(杀死指定名称的进程),如果匹配的pid有两个及其以上,kill也能处理掉,设计这个功能的工程师实在是太高明了!赞!#!/bin/bashpn...
  • 修改java进程名称

    2021-03-06 14:38:56
    当同一个服务器上启动多个tomcat后,我们会在任务管理器中看见多个java.exe,当我们需要对某个tomcat进行监控时,却无法区分出该tomcat的进程,那么如何修改进程名呢?可以使用端口号来区分不同的tomcat进程,使用...
  • 当我执行ps时,我得到的只是“python”进程名称。参考方案http://code.google.com/p/procname/用法示例:# Lets rename:>>> procname.setprocname('My super name')# Lets check. Press Ctrl+Zuser@comp...
  • 在shell环境下,使用进程名称查询进程ID非常简单,例如通过 ps -ef | grep "proc_name"来查看名为“proc_name”进程,也可以通过pidof "proc_name"来获取进程ID。例如:mvg@ubuntu-MS-7A54:~/test$ ps -ef | grep ...
  • 本文实例讲述了Python获取系统所有进程PID及进程名称的方法。分享给大家供大家参考,具体如下:psutil模块中提供了进程管理方法,引用其中的几个方法就能够获得进程的相关信息。简单写个小脚本测试一下,顺便看看本...
  • If a Java program is started, it get's in the system process-monitor the name java. Many Java-programs are that way hard to distinguish. So it would be nice, if a way exists, to set the name, that wi....
  • 可以查看到应用进程名称 这时如果想修改可以在APP 的build.gradle中applicationId,修改完成,重新make project android { compileSdkVersion 28 buildToolsVersion "28.0.3" defaultConfig { applicationId:...
  • ps -efww|grep -w 'helloworld'|grep -v grep|...“ps -efww”是查看所有进程的命令。这时检索出的进程将作为下一条命令“grep“的输入,注意要结束其它程序时,请将上面命令中的helloworld替换成其它程序名,-w 'h...
  • 由于可能有多个进程名称实例正在运行,因此进程的映像名称与PID之间没有一对一的关联。 您必须使用EnumProcesses枚举进程并检查每个进程的基本模块名称,如Burgos所述。FWIW,。Net通过提供GetProcessesByName API来...
  • 如何修改java程序的进程名把javaw.exe改名 同样的,你把java.exe改名,比如改成 myjava.exe 启动程序的时候 myjava your_class 这样进程就是myjava那些已经犯过的错误,有一些是因为来不及,有一些是因为刻意躲避,...
  • Our Java Swing application is running on Windows and wrapped in an exe file using Launch4J.We would like to customize our application process name and description (in Windows' task manager) as it is c...
  • copy '%JAVA_HOME%\bin\java.exe' '%JAVA_HOME%\bin\my_java.exe' set _RUNJAVA='%JAVA_HOME%\bin\my_java' 注意:my_java为你所想看到的进程名字(即在任务管理器中的映像名称),其实就是拷贝一份java.exe文件,并...
  • Linux中的每个进程对应于内核中的struct task_struct,它在include / linux / sched.h中定义. 在这个定义中,有一个字段char comm[TASK_COMM_LEN],根据注释引用不包括路径的可执行文件名: char comm[TASK_COMM_LEN];...
  • 我猜OpenProcess的功能应该有帮助,因为你的进程拥有必要的权限.获取该进程的句柄后,可以使用GetModuleFileNameEx函数获取进程的完整路径(.exe文件的路径).#include "stdafx.h"#include "windows.h"#include "tchar.h...
  • 1.释义pkill命令可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉2.系统帮助Usage:pkill [options] Options:-, --signal signal to send ...
  • ps -ef | grep 进程名称 | grep -v "grep" | awk '{print $2}' | xargs kill 解析: ps -ef 查找所有进程 grep 进程名称关键字 grep -v grep 因为使用grep输出的进程会包含grep命令本身,所以使用grep -v ...
  • 来执行程序在后台运行,但很鸡肋,在linux里用jps命令显示时,进程名称显示是jar,看不到对应的程序名,还需要借助其他命令去查看哪个jar是我们要找的程序,如下图所示: 其实要展示jar包名称很简单,只需加上jar...
  • ps -ef | grep ffmpeg | grep -v grep | awk '{print $2}' | xargs kill -9 ffmpeg是指定的进程名称
  • 目录根据端口号,查询进程名称和进程ID根据进程名称,查询进程ID和端口号根据进程ID,查询进程名称和端口号 知道端口号、进程名称、进程ID中的任意一个,怎么查询其他信息?本文总结一下使用netstat对端口号、进程...
  • C# 获取进程名称和所占用的内存

    千次阅读 2021-07-23 16:26:30
    foreach (Process ps in Process.GetProcesses()) { PerformanceCounter pf1 = new PerformanceCounter("Process", "Working Set - Private", ps.ProcessName); PerformanceCounter pf2 = new PerformanceCounter...
  • 获取名称和pid: def getProlist(): for proc in psutil.process_iter(): try: # pinfo = proc.as_dict(attrs=['pid', 'name']) pinfo = proc.as_dict(attrs=['pid', 'name']) except psutil.NoSuchProcess:
  • tasklist | findstr qt qtcreator.exe 18744 Console 1 133,872 K
  • `/proc/$pid/status` 获取的文件名称存在 15 个字符长度的截断问题,如何避免这个问题?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 636,534
精华内容 254,613
关键字:

进程名称

友情链接: 茉莉机器人3.2.zip