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 判断一个进程是否是脚本进程的主要内容,如果未能解决你的问题,请参考以下文章