启动时启动特定终端

我使用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。

在系统启动时启动GUI应用程序(如gmome-terminal )的可能方法很少,也许最合适的方法是使用启动应用程序 (另请参阅)。 这样,应用程序将在用户登录时启动。 (在其他所有方法中,我们都应该导出一些桌面envvars才能做到这一点。)


为了能够测试我的答案,我创建了一个名为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

现在user1user2应该能够在没有密码的情况下运行sudo myapp

注意:始终使用命令visudo编辑sudoers文件,以确保您不会将自己锁定在系统之外 – 以防您不小心将不正确的内容写入sudoers文件。 visudo会将修改后的文件保存到临时位置,并且只有在修改后的文件可以解析而没有错误的情况下才会覆盖真正的sudoers文件。


下一步是修改启动脚本。 我们称之为myapp_startup并将其放在同一目录/usr/local/bin 。 脚本内容应该是:

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

现在我们可以在Startup Applications中创建一个条目:

在此处输入图像描述

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

进一步阅读:

  • 可能您可以使用tmux ( 或其他会话管理器 )代替gnome-terminal ,如本答案中所述

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