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

目录

功能概述

环境及工具

编写监控APP自启动脚本

Qt调用该脚本,并保证Qt程序退出后仍然后台监控APP

运行结果

工程调试结果

可执行文件运行结果

参考链接:



功能概述

使用Qt编写小软件调用监控软件自启动脚本(apprun.sh),实现后台一直监控QtCreator软件(可以改为自己写的程序)是否在在运行,若运行则什么也不做,否则,重新启动QtCreator软件。

环境及工具

  1. 操作系统:Linux
  2. 编写工具:vi(系统自带)
  3. 编译工具:Qt5.5.1

编写监控APP自启动脚本

  1. 新建文件:touch apprun.sh
  2. 编辑脚本:vi apprun.sh

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

 

      3.输入内容:

  • 方式一:

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

#!/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 &

 

  • 方式二:

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

#!/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.输入:./apprun.sh

运行脚本

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

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

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

5.再打开终端

             输入:pgrep apprun  查看脚本的PID

             输入:pgrep qtcreator 查看qtcreator的PID

 

6.关闭qtcreator软件,等待1s后看是否又重新启动,且可以查看PID是否已改变。

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

Qt调用该脚本,并保证Qt程序退出后仍然后台监控APP

  1. 创建mainwindow工程

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

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

2.mainweindow.h中

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

包含头文件:#include <QProcess>

                     #include <QDebug>

private:

    QProcess m_runShellProcess;

QString shellOutput;

private slots:

    void readProcess();

void finishedProcess();

void on_pushButton_clicked();

3.mainweindow.cpp中

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

初始化:

        shellOutput = "";

 

        connect(&m_runShellProcess,SIGNAL(readyRead()),

            this,SLOT(readProcess()));

        connect(&m_runShellProcess,SIGNAL(finished(int)),

            this,SLOT(finishedProcess()));

 

void MainWindow::readProcess()

{

    QString output = m_runShellProcess.readAll();

    shellOutput += output;

    qDebug() << QString(shellOutput);

}

 

void MainWindow::finishedProcess()

{

    qDebug() << QString(shellOutput) ;

}

 

void MainWindow::on_pushButton_clicked()

{

    if(!m_runShellProcess.startDetached("/home/kjdz/apprun.sh")) //这是我的shell脚本的位置

    {

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

    }

    else

    {

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

    }

}

 

主要代码解释:

if(!m_runShellProcess.startDetached("/home/kjdz/apprun.sh"))

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

(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)

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

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

 

 

运行结果

工程调试结果

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

可执行文件运行结果

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

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

参考链接:

参考链接:https://blog.csdn.net/wg22222222/article/details/89234804

参考链接:https://blog.csdn.net/QMW19910301/article/details/82972313

参考链接:https://blog.csdn.net/rosekin/article/details/15341835

参考链接:https://www.cnblogs.com/xupeidong/p/9317841.html

参考链接:https://blog.csdn.net/kucoffee12/article/details/75200101

参考链接:https://blog.csdn.net/qinxiandiqi/article/details/41626215   (bash编写)