koc*_*oco 5 init.d scripts init gnome-terminal
我需要在 Ubuntu 启动时自动运行应用程序。我在没有打开终端的情况下运行了这个应用程序。但是,此应用程序在终端窗口中显示了一些信息,因此,我需要在打开 gnome-terminal(自动)后严格运行该应用程序。为此我已经试过在init.d中创建一个脚本文件,因为它是解释在这里。脚本的内容是:
#!/bin/bash
cd /home/mediambient/programa
/usr/bin/gnome-terminal -e ./driver &
Run Code Online (Sandbox Code Playgroud)
如果我执行该文件,这会起作用,但在我重新启动计算机时似乎没有任何作用。谁能告诉我我做错了什么?
提前致谢。
您不能制作从窗口运行init.d
并显示gnome-terminal
窗口的脚本,因为脚本在init.d
有任何登录会话可以显示之前运行。它们甚至在图形用户界面运行之前就运行了。
如果您需要在机器启动时运行此脚本,那么与其尝试让它自动显示文本,不如让它将其输出写入日志文件。要使其同时运行常规输出和错误输出到日志文件,请按如下方式制作脚本:
#!/bin/bash
cd /home/mediambient/programa
./driver &>> logfile
Run Code Online (Sandbox Code Playgroud)
替换logfile
为您要使用的日志文件的名称。您可能在/home/mediambient/programa
文件夹中拥有该文件,或者您可以将它放在系统日志文件文件夹 ( /var/log
) 中。这是你的选择。请注意,&>>
操作员会将输出附加到日志文件的末尾。如果您希望它每次都覆盖日志文件,则应改用&>
运算符。
root
用户身份从初始化脚本运行命令另请注意,中的脚本init.d
将作为root
. 如果您不想那样,而是想以programa
user身份运行mediambient
,则可以按如下方式编写脚本:
#!/bin/bash
cd /home/mediambient/programa
sudo -u mediambient ./driver &>> logfile
Run Code Online (Sandbox Code Playgroud)
这会运行程序,mediambient
但仍将日志文件记录为root
. 如果您还想将日志文件记录为mediambient
(如果您将它放在mediambient
的主文件夹中,您可能应该这样做),您可以使用:
#!/bin/bash
cd /home/mediambient/programa
sudo -u mediambient ./driver 2>&1 | sudo -u mediambient tee logfile > /dev/null
Run Code Online (Sandbox Code Playgroud)
(如果你对它的工作原理感兴趣,这解释了2>&1
,这解释了tee
。)
(顺便说一句,请注意,这个脚本中没有特别需要bash
,这是一个优秀的交互式 shell,但是用于 init 和后台脚本有点资源密集型。很长一段时间以来,在 Ubuntu 中运行此类脚本的默认 shell 具有been 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
--then 中显示输出您可以通过按Alt+F2 并运行gnome-session-properties
. 这使您有机会编辑您的启动应用程序。在Command:
字段中输入以下内容:
gnome-terminal --working-directory=/home/mediambient/programa -e ./driver
Run Code Online (Sandbox Code Playgroud)
或者,您可以(某种程度上)通过init.d
在 Ubuntu 首次启动时运行脚本来获得两全其美,然后在以图形方式登录后自动生成一个gnome-terminal
显示输出的窗口mediambient
。为此,请使用以下命令向启动应用程序添加一个条目:
gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 -f logfile
Run Code Online (Sandbox Code Playgroud)
(或者如果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
Run Code Online (Sandbox Code Playgroud)
(我已替换-f
为--follow=name
.)
对于不断增长的日志文件的更先进,或自动,管理,您可以使用的logrotate
命令。该logrotate
命令检查日志文件是否已超过其最大大小或年龄,并“旋转”它们,将它们压缩为编号档案(它们最终会被删除)并创建一个新的日志文件。logrotate
甚至会向您发送有关日志的电子邮件,如果您将其设置为这样做的话。该logrotate
手册介绍了如何写配置文件来告诉logrotate
它记录到操作上。
您可以logrotate
从mediambient
的用户 crontab自动运行。(crontab 列出了由cron
守护程序定期执行的任务。)该crontab
命令安装并运行用户 crontabs。或者,您可以向系统 crontab 添加一个条目/etc/crontab
(如果您在其中运行脚本init.d
并让它以driver
asroot
而不是 as运行,这将是一个合理的选择mediambient
)。请注意,Ubuntu 的系统日志使用 轮换logrotate
,但在 Ubuntu 当前的默认配置中,它不会直接从任何 crontab调用。
日志轮换logrotate
和任务调度的概述cron
应该可以帮助您入门,但请随时在 AskUbuntu 上就这些主题提出更详细的问题,或者,如果您愿意,可以在此处发表评论或编辑您的问题以提供有关您想要的内容的更多详细信息去做(然后我可以对如何做做更详细的解释)。
你这样写:
/usr/bin/gnome-terminal -e ./driver &
Run Code Online (Sandbox Code Playgroud)
行尾的 & 参数表示该程序将被隐藏。这对于运行后台应用程序(例如启动声音的网络服务器)很有用,但在您的情况下,您不应该使用它。解决方案很简单,只需将其删除即可:
/usr/bin/gnome-terminal -e ./driver
Run Code Online (Sandbox Code Playgroud)
我发现您没有使用 GNOME 进行自动启动。使用此说明而不是服务器说明(用上面的命令替换 google-chrome!):Chrome autostart on ubuntu