admin管理员组

文章数量:1536098

2023年12月12日发(作者:)

Qt调用监控APP自启动脚本的实现(详解)

目录

功能概述

使用Qt编写小软件调用监控软件自启动脚本(),实现后台一直监控QtCreator软件(可以改为自己写的程序)是否在在运行,

若运行则什么也不做,否则,重新启动QtCreator软件。

环境及工具

1. 操作系统:Linux

2. 编写工具:vi(系统自带)

3. 编译工具:Qt5.5.1

编写监控APP自启动脚本

1. 新建文件:touch

2. 编辑脚本:vi

3.输入内容:

方式一:

#!/bin/sh

while true

do

process=`ps -ef | grep qtcreator| grep -v bash | grep -v grep`;

if [ "$process" == "" ];then

sleep 1;

echo "process 不存在,开始执行";

qtcreator

else

sleep 1;

echo "process exists"; fi

done &

方式二:

#!/bin/sh

while true

do

process=`ps -ef | grep qtcreator | grep -v grep|wc -l`

echo $process

if [ "$process" -eq 0 ];then

sleep 1;

echo "process 不存在,开始执行";

qtcreator

else

sleep 1;

echo "process exists";

fi

done &

4. 脚本内容解释

方式一:

第1行:必须写,此脚本使用/bin/bash来解释执行

第2行:循环执行

第3行:不解释

第4行:查询qtcreator(可替换为其它appname)进程并过滤

使用ps命令查看所有用户app的进程,可以使用grep过滤关键字

第5行:如果名称为qtcreator的进程不存在就重启它

第6行:等待1s第7行:打印信息“process 不存在,开始执行”

第8行:启动qtcreator进程

第9行:不解释

第10行:等待1s

第11行:打印信息“process exists”

第12行:结构化命令,与if对应

第13行:done与do对应,满足条件会一直运行下去;

最后加 & 符号,表示让脚本在后台执行,即将shell关闭后 程序仍在运行。

方式一与方式二的差别:

第4行:查询qtcreator的进程数

第5行:打印该进程数

第6行:当该进程数等于0时,说明qtcreator未运行,需要启动

其它可参考方式一的内容解释。

5.脚本验证

1. 打开终端

2. 输入:cd /home/kjdz/ 回车

到脚本所在的目录,比如:我的路径为/home/kjdz/

3.输入:./

运行脚本

4.关闭qtcreator会出现消息,并自动打开Qt Creator

5.再打开终端

输入:pgrep apprun 查看脚本的PID

输入:pgrep qtcreator 查看qtcreator的PID

6.关闭qtcreator软件,等待1s后看是否又重新启动,且可以查看PID是否已改变。Qt调用该脚本,并保证Qt程序退出后仍然后台监控APP

1. 创建mainwindow工程

在ui界面上放置一个QPushButton和QLineEdit,用于启动脚本和显示信息。

indow.h中

包含头文件:#include

#include

private:

QProcess m_runShellProcess;

QString shellOutput;

private slots:

void readProcess();

void finishedProcess();

void on_pushButton_clicked();

中初始化: shellOutput = "";

connect(&m_runShellProcess,SIGNAL(readyRead()), this,SLOT(readProcess())); connect(&m_runShellProcess,SIGNAL(finished(int)), this,SLOT(finishedProcess()));

void MainWindow::readProcess(){ QString output = m_l(); shellOutput += output; qDebug() << QString(shellOutput);}

void MainWindow::finishedProcess(){ qDebug() << QString(shellOutput) ;}

void MainWindow::on_pushButton_clicked(){ if(!m_etached("/home/kjdz/")) //这是我的shell脚本的位置 { ui->lineEdit->setText("error");

}

else

{

ui->lineEdit->setText("ok");

}

}

主要代码解释:

if(!m_etached("/home/kjdz/"))

启动外部程序的两种方式:

(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode =

ReadWrite)

外部程序启动后,将随主程序的退出而退出。

(2)分离式:void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString &

workingDirectory = QString(), qint64 * pid = 0)

外部程序启动后,当主程序退出时并不退出,而是继续运行

————————————————

运行结果

工程调试结果

可执行文件运行结果参考链接:

本文标签: 脚本进程监控