Linux C 判断一个进程是否是脚本进程

Posted 小立爱学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C 判断一个进程是否是脚本进程相关的知识,希望对你有一定的参考价值。

文章目录

一、Linux 下常用的脚本

在 /usr/bin/ 下查看系统有哪些脚本文件。在 Linux 系统中,/usr/bin/ 目录下的文件是可执行文件的存放位置之一,它包含了大量的系统命令和工具。这些文件通常是系统安装过程中自动安装的,也可能是用户手动安装的。这些文件的作用非常广泛,包括系统管理、文件处理、文本编辑、编译构建、网络通信等等。

[root@localhost ~]# file /usr/bin/* | grep script | more
/usr/bin/5250keys:                               POSIX shell script, ASCII text executable
/usr/bin/abrt-action-analyze-ccpp-local:         POSIX shell script, ASCII text executable
/usr/bin/abrt-action-analyze-core:               Python script, ASCII text executable
/usr/bin/abrt-action-analyze-vmcore:             Python script, ASCII text executable
/usr/bin/abrt-action-analyze-vulnerability:      POSIX shell script, ASCII text executable
/usr/bin/abrt-action-check-oops-for-hw-error:    Python script, ASCII text executable
/usr/bin/abrt-action-install-debuginfo:          Python script, ASCII text executable
/usr/bin/abrt-action-list-dsos:                  Python script, ASCII text executable
/usr/bin/abrt-action-notify:                     Python script, ASCII text executable
/usr/bin/abrt-action-perform-ccpp-analysis:      Python script, ASCII text executable
/usr/bin/abrt-action-save-kernel-data:           Bourne-Again shell script, ASCII text executable
/usr/bin/abrt-handle-upload:                     Python script, ASCII text executable
/usr/bin/abs2rel:                                Lua script, ASCII text executable
/usr/bin/aclocal:                                Perl script, ASCII text executable
/usr/bin/aclocal-1.13:                           Perl script, ASCII text executable
/usr/bin/alias:                                  POSIX shell script, ASCII text executable
/usr/bin/alsa-delay:                             Bourne-Again shell script, ASCII text executable
/usr/bin/alsaunmute:                             POSIX shell script, ASCII text executable
/usr/bin/amuFormat.sh:                           POSIX shell script, ASCII text executable
/usr/bin/anaconda-cleanup:                       Python script, ASCII text executable
/usr/bin/anaconda-disable-nm-ibft-plugin:        POSIX shell script, ASCII text executable
/usr/bin/analog:                                 Python script, ASCII text executable
/usr/bin/antlr:                                  POSIX shell script, ASCII text executable
/usr/bin/AtoB:                                   POSIX shell script, ASCII text executable
/usr/bin/audit2allow:                            Python script, ASCII text executable
/usr/bin/AuditVerify:                            POSIX shell script, ASCII text executable
/usr/bin/autoconf:                               POSIX shell script, ASCII text executable
/usr/bin/autoexpect:                             POSIX shell script, ASCII text executable
/usr/bin/autoheader:                             Perl script, ASCII text executable
/usr/bin/autom4te:                               Perl script, ASCII text executable
/usr/bin/automake:                               Perl script, ASCII text executable
/usr/bin/automake-1.13:                          Perl script, ASCII text executable

1.1 Bash shell

Bash:Bash(Bourne-Again shell script)是 Linux 中最常用的 shell 之一,它支持变量、条件语句、循环语句等,可以编写各种系统管理和自动化脚本。

Bash shell脚本文件的第一行指定要使用的shell,#! 这两个字符告诉shell用哪个shell来运行脚本,
如下所示使用 bash shell 来运行脚本

#!/bin/bash
[root@localhost ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable

1.2 POSIX shell script

Linux POSIX shell script 是一种基于 POSIX 标准的 shell 脚本语言,它是基于 Unix 系统标准的标准化的 shell 脚本语言,具有很好的兼容性和可移植性。
POSIX 是 “Portable Operating System Interface” 的缩写,是一组与操作系统相关的标准,定义了 Unix 系统的标准接口,包括文件系统、命令行工具、系统调用等。POSIX shell 是遵循 POSIX 标准的 shell 脚本语言,它的语法和功能与 Bash、zsh 等 shell 不完全相同。

#!/bin/sh

1.3 Python script

Python:Python 是一种通用的高级编程语言,也可以用作脚本语言。它具有简洁、易读、易维护等特点,广泛应用于数据分析、Web 开发、科学计算等领域。

#!/usr/bin/python

1.4 Perl script

Perl:Perl 是一种强大的文本处理语言,被广泛应用于网络编程、系统管理等领域。它支持正则表达式、模块化编程等特性,是 Unix 系统中最流行的脚本语言之一。

#!/usr/bin/perl

1.5 Ruby script

Ruby:Ruby 是一种面向对象的动态编程语言,也可以用作脚本语言。它具有简洁、优雅、易读、易学等特点,被广泛应用于 Web 开发、游戏开发等领域。

#!/usr/bin/ruby

1.6 Lua script

Lua:Lua 是一种轻量级、高效的脚本语言,特别适合嵌入式系统和游戏开发。它支持面向对象编程、闭包、协程等特性,具有极高的扩展性和灵活性。

#!/usr/bin/lua

二、脚本进程判断

可以通过查看进程的命令行参数来判断一个进程是否是脚本进程。通常,脚本进程的命令行参数中包含解释器的路径以及脚本文件的路径。

/bin/bash ./test.sh

使用C语言来实现:
(1)打开 /proc/[pid]/cmdline 文件,其中 [pid] 为进程 ID。
(2)读取文件内容,获取进程的命令行参数,将命令行中字符 ‘\\0’ 转化为 ’ '。
(3)判断命令行参数中是否包含解释器的路径和脚本文件的路径,来确定进程是否为脚本进程。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_BUF_SIZE 4096

int is_script_process(int pid)

    char cmdline_path[256];
    char cmdline_buf[MAX_BUF_SIZE];
    char *interpreter = NULL;
    char *script_file = NULL;

    // 构造 /proc/[pid]/cmdline 文件路径
    sprintf(cmdline_path, "/proc/%d/cmdline", pid);

    // 打开 /proc/[pid]/cmdline 文件
    FILE *cmdline_fp = fopen(cmdline_path, "r");
    if (cmdline_fp == NULL) 
        perror("Failed to open cmdline file");
        return 0;
    

    // 读取 /proc/[pid]/cmdline 文件内容, 将命令行中 '\\0' 转化为 ' '
    if( cmdline_fp != NULL ) 
        int str_len = fread(cmdline_buf, 1, MAX_BUF_SIZE - 1, cmdline_fp);
        int i = 0;
        while(i < str_len-1) 
            if(cmdline_buf[i] == '\\0') 
                cmdline_buf[i] = ' ';
            
            i++;
        
    

    // 关闭文件
    fclose(cmdline_fp);

    // 解析命令行参数
    interpreter = strtok(cmdline_buf, " ");
    script_file = strtok(NULL, " ");

    printf("interpreter = %s\\n", interpreter);
    printf("script_file = %s\\n", script_file);

    // 判断是否为脚本进程
    if (interpreter != NULL && script_file != NULL) 
        if (strstr(interpreter, "bin/bash") != NULL || strstr(interpreter, "usr/bin/python") != NULL) 
            return 1;
        
    

    return 0;


int main(int argc, char *argv[])

    int pid = atoi(argv[1]);

    if (is_script_process(pid)) 
        printf("Process %d is a script process\\n", pid);
     else 
        printf("Process %d is not a script process\\n", pid);
    

    return 0;

总结

最近在使用chatgpt,大部分参考 chatgpt 的回答,chatgpt给出的代码还是有一些小问题,代码示例在chatgpt的基础上稍加修改。

以上是关于Linux C 判断一个进程是否是脚本进程的主要内容,如果未能解决你的问题,请参考以下文章

C#winform 有关判断进程的问题

linux shell 判断进程是不是存在

grep在shell脚本中使用,判断进程是否存在

Linux下使用Shell脚本实现进程监控

linu学习笔记--进程基础

linux下通过脚本实现自动重启程序