VirtualBox CentOS Python GUI程序需要在启动时运行而无需登录并输出音频

VirtualBox CentOS Python GUI程序需要在启动时运行而无需登录并输出音频

我在 CentOS(在 VM 中)上的 VM(virtualBox)中运行了一个 Web 服务。要访问它,我使用主机(Windows)上的浏览器。我有一个 Python 脚本,它从 VM 输出音频并启动 GUI(TKinter)。当我选择网页上的按钮时,此脚本就会运行。注意:代码的 GUI 部分用于罕见的用例。大多数时候它不需要运行。

我的问题:当我在虚拟机中登录 CentOS 上的用户时,此脚本运行良好。(屏幕锁定时它也运行良好)。脚本确实不是在 CentOS 关机和开机时运行。我必须首先登录 CentOS 上的用户才能运行该脚本。

我有点新手,但我认为这可能是由于操作系统在有人登录系统之前没有运行任何 GUI 支持造成的。您知道有什么解决方案吗?我无法自动登录(除非我可以保持相同的安全级别,即登录但保持锁定状态)。我不需要看到 GUI,但我需要音频。

我确实弄乱了我的脚本,以便在没有人登录的情况下禁用 TKinter 代码。我运行了 os.popen("last user") 来获取上次登录信息。我检查了“仍然登录”,这是在有人登录时返回的。这让我想到了一个奇怪的用例:

现在系统可以在以下情况下工作:

1)用户登录

或者

2) 用户登录。关闭虚拟机。无需登录即可启动。

如果我再次关闭它,它就不起作用了。重新启动它并运行代码而无需登录。就好像它记得我在上次电源循环之前登录过,但在我第二次重新启动它之后却记不住。

编辑:运行 CentOS 6.7、GNOME 2.28.2

关于该程序的更多信息:这是一个输出音频的 Python 脚本和一个用于在出现问题时调整音频的 GUI。这个 GUI 很少使用,但很有必要。显然,音频本身在相同条件下无法运行(在我删除了所有 GUI 代码以仅测试音频之后)。我不需要担心 GUI 自动化。此外,当 Python-Flask 端点被击中时,会调用 Python 脚本。将脚本移至守护进程是否有意义?我知道程序可以在会话被锁定时启动。

答案1

GUI 程序需要一个运行桌面环境(Gnome、KDE ​​或 mate 等)的活动 X 服务器才能执行,但是,这让我很困惑:

2) 用户登录。关闭虚拟机。无需登录即可启动。

如果我再次关闭它,它就不起作用了。重新启动它并运行代码而无需登录。就好像它记得我在上次电源循环之前登录过,但在我第二次重新启动它之后却记不住。

如果这样可行,则意味着只有当未登录的用户关闭计算机时,您的程序才会失败,但如果已登录的用户关闭计算机,则稍后登录时程序仍会正常工作?如果是这样,我认为这不是桌面问题,但是,以下内容将为您提供解决方法。请转至底部阅读“罕见情况”部分中有关此特定问题的更多信息,或者,如果您想要一个解决方案来自动启动您的会话以保持安全性并避免出现问题,请继续阅读。

通常 CentOS 会预装 Gnome,除非你安装了其他版本。考虑到你说你没有 Linux 经验,我会认为你正在使用 Gnome,并在稍后为你提供一个具体示例,但是,由于你没有明确说明,我也会给你一个通用答案,以便你在需要时可以逐一进行 Google 搜索。

最好的选择是始终使用能够作为 systemd 守护进程运行的非 GUI 程序。这可以让你以相对简单的方式保持最高程度的安全性。当然,这不是唯一的方法,并且根据你的环境,轻微的安全性损失可能是可以接受的。

如果没有这样的程序版本,那么您需要自动启动 x 服务器和用户会话(如果您需要安全性,则可以自动锁定而不关闭)。在默认的带有 GUI 安装的 CentOS 上,我认为这是现在的默认设置(CentOS 7 及更高版本),由于您没有告诉我们您的 CentOS 版本,我将不讨论这个问题。

您应该提供 CentOS 版本以获取有关如何执行此操作的具体说明,因为在 CentOS 6 和 CentOS 7(最常用的版本)之间执行此操作的方式会有所不同。我们还需要知道您使用的桌面环境(Gnome、KDE、mate 等),因为自动登录和阻止会话的方式取决于它。

总而言之,您有两个选择:

正确的解决方法:

  1. 找到一个不需要 GUI 即可运行的程序版本。一些 Linux GUI 只是一个命令行窗口,其他的则同时提供这两种界面,但其中一些确实依赖于 GUI。如果您的程序是其中之一(使用 Python 更有可能),您应该考虑使用其他软件来实现您的目标,因为 GUI 软件自动化虽然并非不可能,但比 CLI 自动化需要更多时间,特别是如果软件迫使您执行多次点击。
  2. 配置它作为守护进程运行(“相当于” Windows 服务)。您需要在配置中将其添加为守护进程,这取决于 CentOS 版本。
  3. 如果您不想研究服务,您可以始终使用“nohup &”技巧来将正常进程作为服务运行,然后将其放入启动脚本并设置看门狗以监视可执行文件是否崩溃(如果您将其配置为守护进程,则 systemd 会为您执行此操作)

我不会进一步讨论这个解决方案,因为我不知道您的程序是否支持这一点,我甚至不知道您想自动启动什么程序。

第二种解决方案(解决方法)

  1. 配置您的 Linux,使其在图形登录窗口中启用 X。(我认为这是 CentOS 7 的默认设置)
  2. 配置桌面环境以实现自动登录。具体步骤取决于您使用的桌面环境(KDE、Gnome、mate 等)
  3. 将您的程序添加到桌面环境程序自动启动列表中。具体过程取决于桌面环境。
  4. (如果需要安全性,则可选)- 将其配置为锁定用户并要求输入密码而不关闭会话。这应该让程序在后台运行。您应该确保您的程序有时间启动,或者即使会话被锁定也能启动。一些安全配置或程序可能会避免这种情况。一个肮脏的解决方案是在锁定屏幕前等待几秒钟,但这会增加安全漏洞,让攻击者有几秒钟的时间进入您的系统并避免它被锁定。

再一次,如果您提供更多细节,我就可以寻找有关如何实现此目的的具体命令或提示,但是,这是适用于任何现代 Linux 操作系统的理论答案。

例如,CentOs 7 + Gnome 就是这样简单:

自动登录(为了完整性,复制了链接的迷你指南和图像):

  1. 照常登录 GNOME

  2. 在右上角找到你的名字并点击它

  3. 现在选择“设置”

  4. 在新打开的窗口中,找到用户

  5. 点击右上角的解锁

  6. 选择您自己的用户并开启自动登录

您需要具有主管权限才能进行此更改。下次重新启动系统时,您将自动登录。

用户配置屏幕

CentOS 7 中 Gnome 中的自动启动应用程序- 我没有复制答案,因为它在 StackExchange 里面。向您展示如何使用 GUI 添加程序。

自动登录后锁定屏幕- 这是针对 ubuntu + gnome 的,但应该可以与使用 gnome 的任何东西一起使用。

罕见的情况

您在 2 上说的话很奇怪。如果程序实际上可以在没有打开 X 服务器的情况下运行,但在这种情况下关闭时失败,则意味着这不一定是桌面环境问题:程序可能未正确关闭并阻止系统稍后初始化它(例如,留下一些锁)。您应该提供日志或联系程序的支持论坛以获取有关如何在任何情况下正确关闭程序的说明。它甚至可能是由于软件中的错误导致的权限问题,该错误未以正确的模式打开内容。应该提供有关该程序的更多详细信息,但正如我所说,最好始终与软件特定的社区联系。

关于如何调试此类事情的一些通用提示:

  • 阅读日志。通常,这样的错误会在没有任何配置的情况下在日志中显示一些内容:最终,很多问题都可以通过复制粘贴 Google 中的一个错误行来解决。如果您看不到任何内容,请阅读有关如何提高应用程序日志级别(通常称为调试级别或详细程度)的信息。查看配置文件,以防出现未知日志文件或程序输出到 syslog。您可能实际上需要修改配置文件中的某些内容,以使程序将日志存储在文件中:调查它,如果文档不够清楚,请询问社区。
  • 如果程序设计不当,它可能不会给你机会配置正确的日志记录,因此你需要积极监控你的进程以查看它访问了什么。你可能会发现你的程序留下了一个锁或一个未正确处理的 PID 文件,并阻止新实例启动。在大型程序中,这可能是一个繁琐的过程,特别是如果你没有经验的话。这是一个非常基本的起点,它将让你了解系统中正在发生的事情: Linux 监控工具 1 Linux 监控工具 2

  • 沙盒技术在 Linux 上也是可用的,不仅可以用于安全,还可以用于类似本场景的测试目的。您可以了解 Linux 沙盒: Linux 中的沙盒方法 然而,这种方法通常需要时间和经验。

编辑:

在您的情况下,使用这个依赖于 GUI 的脚本是有意义的,您不需要将其切换出去。

我不是一个 GUI 专家,但是根据有一种方法可以让 KDE 自动锁定。也许 Gnome2 中也有一种方法,但是我不确定。“自动锁定”脚本是一种选择,但正如我所说,它最终可能会成为一个漏洞,即使它通常只提供几毫秒的时间。我不是安全方面的专家,特别是在桌面环境方面,所以也许没有真正的责任,但从理论的角度来看,那里存在潜在的漏洞。也许让特权较低的用户使用不可用的桌面布局可以缓解您的问题。

相关内容