我使用 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
文件以确保您不会锁定自己,以防万一您不小心将错误的内容写入文件sudoers
。visudo
将保存您修改后的文件到临时位置,并将 仅有的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
。
进一步阅读:
cron-gui-launcher.bash
此外,您可以通过该项目中的脚本通过 Cron(或其他一些受限环境)启动启动脚本:https://github.com/pa4080/cron-gui-launcher。该脚本将等待用户登录,然后导出所有 DE 变量等...但在当前情况下,最终结果将与我们使用启动应用程序相同。