我需要在 Ubuntu 启动时自动运行一个应用程序。我已经在不打开终端的情况下运行了这个应用程序。但是,这个应用程序在终端窗口中显示一些信息,因此,我需要该应用程序在打开 gnome-terminal 后严格运行(自动)。为此,我尝试在 init.d 中创建一个脚本文件,如下所述这里。脚本内容为:
#!/bin/bash
cd /home/mediambient/programa
/usr/bin/gnome-terminal -e ./driver &
如果我执行该文件,它就会起作用,但是当我重新启动计算机时似乎没有任何作用。有人能告诉我我做错了什么吗?
提前致谢。
答案1
您无法编写一个从窗口运行init.d
并显示gnome-terminal
窗口的脚本,因为脚本在init.d
显示窗口的任何登录会话之前运行。它们甚至在图形用户界面运行之前就运行了。
改为记录到文件
如果您需要在机器启动时运行此脚本,则不应尝试使其自动显示文本,而应使其将其输出写入日志文件。要使其将常规输出和错误输出同时运行到日志文件,请按如下方式编写脚本:
#!/bin/bash
cd /home/mediambient/programa
./driver &>> logfile
代替logfile
替换为要使用的日志文件的名称。您可能将该文件放在文件夹中/home/mediambient/programa
,或者将其放在系统日志文件文件夹中 ( /var/log
)。您可以自行选择。请注意,&>>
运算符会将输出附加到日志文件的末尾。如果您希望它每次都覆盖日志文件,则应改用运算&>
符。
root
以非用户身份运行初始化脚本中的命令
还请注意, 中的脚本init.d
将以 的身份运行root
。如果您不想这样,而是想以programa
用户 的身份运行mediambient
,您可以编写脚本如下:
#!/bin/bash
cd /home/mediambient/programa
sudo -u mediambient ./driver &>> logfile
这将以 的身份运行程序,mediambient
但仍将日志文件记录为root
。如果您还想将日志文件记录为mediambient
(如果您将其放在mediambient
的主文件夹中,则可能应该这样做),您可以使用:
#!/bin/bash
cd /home/mediambient/programa
sudo -u mediambient ./driver 2>&1 | sudo -u mediambient tee logfile > /dev/null
(如果你对它的具体工作原理感兴趣,这解释2>&1
和这解释tee
。
(顺便说一句,请注意,此脚本中没有任何内容特别需要bash
,这是一个出色的交互式 shell,但用于初始化和后台脚本会占用一些资源。很长一段时间以来,在 Ubuntu 中运行此类脚本的默认 shell 一直是dash
,它要轻量级得多。如果使用#!/bin/sh
而不是#!/bin/bash
,则将使用操作系统首选的 shell 来运行 POSIX 样式的 shell 脚本。对于这个脚本,这并不重要,但养成这个习惯是个好习惯。)
当用户以图形方式登录时(而不是在启动时)运行脚本
或者,如果您真正需要的是让脚本在用户以mediambient
图形方式登录时运行(而不是在计算机启动时),那么您可以让它在窗口driver
中运行gnome-terminal
。您不能init.d
这样做;相反,您必须使用桌面环境提供的功能。
如果您正在运行基于 GNOME 的 Ubuntu(以 Unity、Unity 2D、GNOME Classic/Fallback 或 GNOME Shell 作为桌面环境)——我猜您是这样的,因为您想以 -- 显示输出,那么gnome-terminal
您可以按Alt+F2 并运行 来执行此操作gnome-session-properties
。这使您有机会编辑启动应用程序。在字段中输入以下内容Command:
:
gnome-terminal --working-directory=/home/mediambient/programa -e ./driver
在启动时运行脚本、记录到文件以及在用户以图形方式登录时自动查看日志
或者,您可以(某种程度上)同时实现两全其美,即init.d
在 Ubuntu 首次启动时运行脚本,然后在图形登录gnome-terminal
后自动生成一个显示输出的窗口mediambient
。为此,使用以下命令向启动应用程序添加一个条目:
gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 -f logfile
(或者如果logfile
是日志文件的绝对路径而不是相对路径,那么可以省略--working-directory=/home/mediambient/programa
。)
-n 512
表示它最多显示日志文件中的 512 行,从开始显示日志文件开始算起。(然后,它会在每行添加到日志文件时显示它们。)这通常是一个合理的选择,因为窗口gnome-terminal
默认最多只能记住 512 行。如果您gnome-terminal
使用修改后的配置文件运行,该配置文件可以记住超过 512 行,那么您可以相应地编辑tail
命令。
限制日志文件的大小
如果您担心日志文件的大小不断增长,首先要做的是弄清楚这是否真的可能是一个问题。您可能只能估算一下。假设日志文件每秒增长一行(这比大多数日志文件快得多),每行长度为 80 个字符。那么一个月后,文件大小只有 200 MB。一年后它会增长到大约 2.5 GB。几百兆字节可能没问题,几千兆字节可能不行,所以问题是,您是否能够手动编辑日志文件以清除它,至少每隔几个月一次?
如果接近每分钟一行,则文件的增长速度每年少于 50 MB,在这种情况下,您可能永远不必担心清除文件。
有两种简单的方法可以清除文件。您可以编辑它并删除部分(或全部)。或者您可以删除它,然后让它再次创建。如果删除它,它将继续占用磁盘空间,直到没有任何东西再访问它,这意味着您可能需要重新启动driver
。您还必须重新启动,但您可以使用不保持文件打开tail
的修改后的命令来解决此问题:tail
gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 --follow=name logfile
(我已替换-f
为--follow=name
。)
对于更高级或自动的不断增长的日志文件的管理,您可以使用命令logrotate
。该logrotate
命令检查日志文件是否已超过其最大大小或使用期限,并“轮换”它们,将它们压缩为编号存档(最终会被删除)并创建新的日志文件。logrotate
如果您设置了此功能,它甚至会向您发送有关日志的电子邮件。logrotate
手册页解释如何编写配置文件来告知logrotate
要对哪些日志进行操作。
您可以logrotate
从 的用户 crontab 自动运行mediambient
。(crontab 列出了由 crontab 定期执行的任务。cron
守护进程。) 这crontab
命令安装并运行在用户 crontab 上。或者,您可以向系统 crontab 添加一个条目/etc/crontab
(如果您在 中运行脚本并让其以而不是init.d
运行,这将是一个合理的选择)。请注意,Ubuntu 的driver
root
mediambient
系统日志被旋转logrotate
,虽然在Ubuntu的当前默认配置中,它不被称为直接地从任何 crontab。
这个关于日志轮换logrotate
和任务调度的概述cron
应该可以帮助您入门,但是您可以随意在 AskUbuntu 上询问有关这些主题的更详细的问题,或者,如果您愿意,可以在这里发表评论或编辑您的问题以提供有关您想要做什么的更多详细信息(然后我可能会提供更详细的解释如何去做)。
答案2
您已这样写道:
/usr/bin/gnome-terminal -e ./driver &
行末的 & 参数表示程序将被隐藏。这对于运行启动声音的 Web 服务器等后台应用程序很有用,但对于您来说,不应该使用它。解决方案很简单,只需将其删除即可:
/usr/bin/gnome-terminal -e ./driver
我发现您没有使用 GNOME 自动启动。请使用此说明代替服务器说明(用上面的命令替换 google-chrome!):Ubuntu 上的 Chrome 自动启动