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)
外部程序启动后,当主程序退出时并不退出,而是继续运行
————————————————
运行结果
工程调试结果
可执行文件运行结果参考链接:
版权声明:本文标题:Qt调用监控APP自启动脚本的实现(详解) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1702389523a4495.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论