使用systemd启动Qt应用程序

使用systemd启动Qt应用程序,qt,startup,systemd,wayland,qtwayland,Qt,Startup,Systemd,Wayland,Qtwayland,我想在启动期间在我的板上启动一个“Qt”应用程序。它使用systemd启动进程,图形后端是wayland。由于它使用systemd,我编写了一个简单的服务来启动我的应用程序。公共安全局 [Unit] Description=Qt App After=multi-user.target [Service] Type=simple WorkingDirectory=/home/root ExecStart=/etc/init.d/qtapp start [Install] Want

我想在启动期间在我的板上启动一个“Qt”应用程序。它使用systemd启动进程,图形后端是wayland。由于它使用systemd,我编写了一个简单的服务来启动我的应用程序。公共安全局

[Unit] 
Description=Qt App 
After=multi-user.target


[Service] 
Type=simple 
WorkingDirectory=/home/root 
ExecStart=/etc/init.d/qtapp start

[Install] 
WantedBy=multi-user.target
“/etc/init.d/qtapp”脚本只是“profile”的来源,设置XDG_*envs并启动我的Qt应用程序。但在这种设置下,我的应用程序根本无法启动。 但当我查看正在运行的进程列表时,它也列出了我的应用程序。所以,它正在运行,但我在屏幕上什么也看不到

如果我在主板启动后手动启动应用程序,它运行正常。我不知道为什么它不是从systemd启动的


有人面对过这个问题吗?有什么建议可以让它工作吗?

我在工作中也遇到了同样的问题。我需要7/24运行我的应用程序,当它崩溃或用户手动退出时,应用程序应该自动重新运行。为此,我在/etc/init.d/xxx中创建了用于启动的文件。但是,我没有在这里运行我的应用程序。它只是启动另一个bash脚本,检查正在运行的进程,并使用“grep”检查我的应用程序是否正在运行。如果它没有运行,它将再次运行。我为什么这样使用

  • 我添加了所有库、Qt、Opencv和其他库
  • 添加命令会更容易,比如显示需要使用哪个配置文件以及应该使用哪个调试级别
  • 从控制台输出存储日志文件,如(2>&1等)
编辑:

因此,您可以创建upstart脚本,启动其他应用程序的bash脚本。例如,

Upstart脚本:

start on runlevel [2345]
stop on runlevel [016]

sleep 120

script
    exec /.1/MyApp/myApp.sh
end script
下面是myApp.sh:

    #!/bin/bash

    export QTDIR=/.1/MyApp/lib:/usr/local/Trolltech-4.8.2/
    export LD_LIBRARY_PATH=/.1/MyApp/lib:/usr/local/Trolltech-4.8.2/lib

    while true;do

    ps cax | grep myApp > /dev/null
    if [ $? -eq 0 ]; then
        echo "Application running " >> /.1/MyApp/bin/log/testUp.log
        sleep 10
    else
        echo "Application started " >> /.1/MyApp/bin/log/testUp.log
        cd /.1/MyApp/bin/
        /.1/MyApp/bin/myApp -c /.1/MyApp/conf/myApp.cfg -d 5  2>&1  > /.1/MyApp/bin/log/testUp.log

    fi

    done

我在工作中也遇到了同样的问题。我需要7/24运行我的应用程序,当它崩溃或用户手动退出时,应用程序应该自动重新运行。为此,我在/etc/init.d/xxx中创建了用于启动的文件。但是,我没有在这里运行我的应用程序。它只是启动另一个bash脚本,检查正在运行的进程,并使用“grep”检查我的应用程序是否正在运行。如果它没有运行,它将再次运行。我为什么这样使用

  • 我添加了所有库、Qt、Opencv和其他库
  • 添加命令会更容易,比如显示需要使用哪个配置文件以及应该使用哪个调试级别
  • 从控制台输出存储日志文件,如(2>&1等)
编辑:

因此,您可以创建upstart脚本,启动其他应用程序的bash脚本。例如,

Upstart脚本:

start on runlevel [2345]
stop on runlevel [016]

sleep 120

script
    exec /.1/MyApp/myApp.sh
end script
下面是myApp.sh:

    #!/bin/bash

    export QTDIR=/.1/MyApp/lib:/usr/local/Trolltech-4.8.2/
    export LD_LIBRARY_PATH=/.1/MyApp/lib:/usr/local/Trolltech-4.8.2/lib

    while true;do

    ps cax | grep myApp > /dev/null
    if [ $? -eq 0 ]; then
        echo "Application running " >> /.1/MyApp/bin/log/testUp.log
        sleep 10
    else
        echo "Application started " >> /.1/MyApp/bin/log/testUp.log
        cd /.1/MyApp/bin/
        /.1/MyApp/bin/myApp -c /.1/MyApp/conf/myApp.cfg -d 5  2>&1  > /.1/MyApp/bin/log/testUp.log

    fi

    done

这可能是因为,这里的僵局。您已经在服务文件的[Unit]部分给出了
After=multi-user.target
,它将在multi-user.target启动后启动您的服务,同时您希望在服务文件的[Install]部分给出选项
WantedBy=multi-user.target

这将创建死锁类型的依赖项。为了避免这种情况,请在[安装]部分使用不同的目标启动您的服务。或者从[Unit]部分中删除“After=”选项(如果您不需要任何依赖项)


注意:在重新启动系统之前,请使用
systemctl启用您的\u服务\u文件启用您的服务文件。service

这可能是因为此处出现死锁情况。您已经在服务文件的[Unit]部分给出了
After=multi-user.target
,它将在multi-user.target启动后启动您的服务,同时您希望在服务文件的[Install]部分给出选项
WantedBy=multi-user.target

这将创建死锁类型的依赖项。为了避免这种情况,请在[安装]部分使用不同的目标启动您的服务。或者从[Unit]部分中删除“After=”选项(如果您不需要任何依赖项)


注意:在重新启动系统之前,请使用
systemctl enable your_service_file启用您的服务文件。服务

可能是权限问题,您是否尝试使用启动时执行的用户从命令行运行qtapp?我曾以root用户身份登录。我可以从命令行运行相同的应用程序,而不会出现任何问题。启动后,我检查了systemctl状态,可以看到我的应用程序正在运行,但屏幕上没有显示任何内容。因此,你确定systemd以root用户身份运行你的应用程序?我对systemd不太了解。因此,我不确定它是否以root用户身份运行我的应用程序。可能是权限问题,您是否尝试使用启动时执行qtapp时使用的同一用户从命令行运行qtapp?我以前以root用户身份登录。我可以从命令行运行相同的应用程序,而不会出现任何问题。启动后,我检查了systemctl状态,可以看到我的应用程序正在运行,但屏幕上没有显示任何内容。因此,你确定systemd以root用户身份运行你的应用程序?我对systemd不太了解。所以,我不确定它是否以root身份运行我的应用程序。我没有清楚地了解你。你能用systemd启动一个Qt(或任何其他GUI)应用程序吗?我没弄清楚。您是否能够使用systemd启动Qt(或任何其他GUI)应用程序?