Qt调用监控APP自启动脚本的实现(详解)
目录
功能概述
使用Qt编写小软件调用监控软件自启动脚本(apprun.sh),实现后台一直监控QtCreator软件(可以改为自己写的程序)是否在在运行,若运行则什么也不做,否则,重新启动QtCreator软件。
环境及工具
- 操作系统:Linux
- 编写工具:vi(系统自带)
- 编译工具:Qt5.5.1
编写监控APP自启动脚本
- 新建文件:touch apprun.sh
- 编辑脚本:vi apprun.sh
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.脚本验证
- 打开终端
- 输入:cd /home/kjdz/ 回车
到脚本所在的目录,比如:我的路径为/home/kjdz/
3.输入:./apprun.sh
运行脚本
4.关闭qtcreator会出现消息,并自动打开Qt Creator
5.再打开终端
输入:pgrep apprun 查看脚本的PID
输入:pgrep qtcreator 查看qtcreator的PID
6.关闭qtcreator软件,等待1s后看是否又重新启动,且可以查看PID是否已改变。
Qt调用该脚本,并保证Qt程序退出后仍然后台监控APP
- 创建mainwindow工程
在ui界面上放置一个QPushButton和QLineEdit,用于启动脚本和显示信息。
2.mainweindow.h中
包含头文件:#include <QProcess>
#include <QDebug>
private:
QProcess m_runShellProcess;
QString shellOutput;
private slots:
void readProcess();
void finishedProcess();
void on_pushButton_clicked();
3.mainweindow.cpp中
初始化:
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)
外部程序启动后,当主程序退出时并不退出,而是继续运行
————————————————
运行结果
工程调试结果
可执行文件运行结果
参考链接:
参考链接:https://blog.****.net/wg22222222/article/details/89234804
参考链接:https://blog.****.net/QMW19910301/article/details/82972313
参考链接:https://blog.****.net/rosekin/article/details/15341835
参考链接:https://www.cnblogs.com/xupeidong/p/9317841.html
参考链接:https://blog.****.net/kucoffee12/article/details/75200101
参考链接:https://blog.****.net/qinxiandiqi/article/details/41626215 (bash编写)