24. Perl 进程管理-调用系统命令或外部脚本

    xiaoxiao2022-07-04  166

    Linux 系统中, 每执行一条命令或运行一个程序,都会产生一个主进程, 在主进程运行的时候,也有可能会产生多个子进程, 我们可以通过命令: ps -ef | grep xxx 来查看进程相关的信息.但是对于有些命令, 执行速度很快, 比如说ls /, 这样我们通过ps -ef 并不能看到与ls 相关的进程信息, 虽然看不到, 但是这不能表示ls 在执行的时候不会产生进程, 只是因为执行速度太快,难以捕获罢了.

    1. 核心内容

    perl 对进程的管理功能也是比较强大的, 但是笔者用perl 只是为了写一些脚本程序, 所以只需要掌握以下内容就行了:

    perl 程序中调用系统命令或执行其它系统脚本perl 向其它进程发送信号(关闭其它进程)perl 接收其它进程发送的信号(被Ctrl+C 中断程序执行)

    1. 调用系统命令或执行其它程序

    perl 语言中调用执行系统命令或其它程序时会创建一个新的子进程, 执行命令有三种模式: system, qx, exec

    父进程: perl 脚本所占用的进程为父进程, 又称主进程子进程: perl 脚本调用系统命令或执行其它程序占用的进程 命令格式描述system主进程休眠,启动子进程执行其它程序,不捕获输出返回状态码, 0 为成功, 其它为失败qx / ``主进程休眠, 启动子进程执行其它程序, 捕获输出返回子进程标准输出的内容exec主进程结束, 启动子进程执行其它程序, 不捕获输出无返回值

    1.1 system

    命令格式1: system " xxx "; 双引号中的$ 引用的是perl标量, $ 引用的是shell 的系统环境变量命令格式2: system ’ xxx '; 单引号中的$ 引用的是shell 中的环境变量, $ 无实用意义 #输出当前系统时间 system "echo date"; #输出perl标量 system "echo $JAVA_HOME"; #输出环境变量 system "echo \$JAVA_HOME"; #输出环境变量 system 'echo $JAVA_HOME';

    1.2 qx

    反引号`` 是qx 的简写形式, qx 可以用(), “”, ‘’ 等作为限定符, 返回值可由标量或数组进行捕获.在标量上下文中输出的内容为一个字符串, 在数组上下文中, 按换行符分隔为一个一个的元素.

    命令格式1: l i n e = ‘ x x x ‘ ; 反 引 号 中 line = `xxx`; 反引号中 line=xxx; 引用的是perl 标量, $ 引用的是shell 系统环境变量命令格式2: l i n e = q x ′ x x x ′ ; q x 单 引 号 中 line = qx ' xxx '; qx 单引号中 line=qxxxx;qx引用的是shell 系统环境变量, $ 无实用意义命令格式3: @lines = qx " xxx "; qx 双引号中$引用的是perl 变量, $ 无实用意义命令格式4: @lines = qx ( xxx ); qx 双引号中$引用的是perl 变量, $ 无实用意义 $JAVA_HOME = qx' echo $JAVA_HOME '; print "shell:JAVA_HOME=$JAVA_HOME "; $JAVA_HOME = qx ( echo \$JAVA_HOME ); print "shell:JAVA_HOME=$JAVA_HOME "; $JAVA_HOME = `echo \$JAVA_HOME`; print "shell:JAVA_HOME:$JAVA_HOME ";

    1.3 exec

    exec 启动子进程后, 主进程会结束, 所以exec 通常是脚本中的最后一行代码exec 常用于为子程序设置运行环境, 可通过直接修改%ENV 哈希中的环境变量直接修改运行环境, 修改的系统环境变量会影响其启动的子进程,修改的环境变量只在当前脚本中有效, 不会对真正的系统环境变量有所影响. # 为子程序设置环境变量, 指定jdk 环境 $ENV{JAVA_HOME} = '/opt/app/tomcat/jdk/jdk1.8_0131'; # 启动tomcat exec '/opt/app/tomcat/tomcat-8-8080/bin/startup.sh &';
    最新回复(0)