启动时启动特定终端

启动时启动特定终端

我使用 libpcap 和 ncurses 编写了一个应用程序。显然,这个应用程序应该在终端中运行。

因此,我创建了一个脚本,以固定大小在 gnome-terminal 中启动我的应用程序:

#!/bin/sh
gnome-terminal --geometry=75x36+0+0 --command="myapplication"'

我想在启动时执行该命令(在当前登录用户的桌面出现后)。以 root 身份运行该命令很重要。否则,libpcap 将无法嗅探数据包。我知道其中涉及的所有风险。

我创建了以下.service文件:

[Unit]
Description=My Application

[Service]
User=root
Type=simple
ExecStart=/usr/local/bin/myshellfile

[Install]
WantedBy=multi-user.target

我把它放进去/etc/systemd/system/myservice.service并预设

sudo systemctl preset myservice.service

尽管如此,它还是不起作用。我在这里做错了什么?在更新状态下运行 Ubuntu 16.04。

答案1

启动 GUI 应用程序的方法有几种(例如gmome终端)在系统启动时,也许最合适的是使用启动应用程序(看)。这样,当用户登录时,应用程序就会启动。(在其他每种方法中,我们都应该导出一些桌面环境变量才能做到这一点。)


为了能够测试我的答案,我创建了可执行文件,名为myapp,位于/usr/local/bin。它只会在目录中的文件中添加当前日期和时间/root,因此我们需要 root (sudo) 权限才能运行该脚本:

#!/bin/bash
date >> /root/date.txt

我们可以通过 授予特定用户无需密码即可运行命令的权限sudo。无论用户是否属于sudoers组。我们可以使用sudo visudo安全地编辑/etc/sudoers并添加一行或多行,如下所示:

user1 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp
user2 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp

更好的办法是创建一个单独的文件,例如/etc/sudoers.d/myapp,将这些规则放在哪里。为此,我们将使用以下命令:sudo visudo -f /etc/sudoers.d/myapp

现在user1应该user2可以sudo myapp无需密码运行。

笔记:始终使用命令visudo编辑sudoers文件以确保您不会锁定自己,以防万一您不小心将错误的内容写入文件sudoersvisudo将保存您修改后的文件到临时位置,并将 仅有的sudoers如果修改后的文件能够被无错误地解析,则覆盖真实文件...来源


下一步是修改启动脚本。我们来调用它myapp_startup并将其放入同一目录中/usr/local/bin。脚本内容应该是:

#!/bin/sh
gnome-terminal --geometry=75x36+0+0 -x bash -c "sudo myapp; exec bash"
  • 提供了上述命令的详细说明这里
  • 如果您想自动最小化窗口使用:方法。

现在我们可以创建一个条目启动应用程序像这样:

在此处输入图片描述

  • 另外,我们可以这样修改启动脚本:sleep 3 && gnome-terminal ...在整个桌面初始化后启动新的终端窗口。
  • 当脚本不在添加到用户$PATH变量(echo $PATH)的目录中时,我们应该使用完整路径,例如:/usr/local/bin/myapp_startup

进一步阅读:

  • 代替gnome 终端也许你可以使用tmux或者其他会话管理器)正如所描述的在这个答案中

  • cron-gui-launcher.bash此外,您可以通过该项目中的脚本通过 Cron(或其他一些受限环境)启动启动脚本:https://github.com/pa4080/cron-gui-launcher。该脚本将等待用户登录,然后导出所有 DE 变量等...但在当前情况下,最终结果将与我们使用启动应用程序相同。

相关内容