1

我想在启动期间在我的板上启动一个“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_* 环境并启动我的 Qt 应用程序。但是有了这个设置,我的应用程序根本没有启动。但是当我检查正在运行的进程列表时,它也列出了我的应用程序。所以,它正在运行,但我在屏幕上什么也没有。

如果我在板子启动后手动启动应用程序,它运行良好。我不确定为什么它没有从 systemd 启动。

有人遇到过这个问题吗?以及我可以尝试使其工作的任何建议?

4

2 回答 2

0

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

这正在创建一种死锁类型的依赖关系。为避免这种情况在 [Install] 部分中以不同的目标启动您的服务。或者只是从 [Unit] 部分中删除“After =”选项(如果您不想要任何依赖项)

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

于 2015-07-14T05:18:04.557 回答
0

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

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

编辑:

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

新贵脚本:

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
于 2015-07-13T12:22:05.407 回答