【问题标题】:launch terminal and execute script from systemd after reboot重启后启动终端并从 systemd 执行脚本
【发布时间】:2018-04-17 18:09:06
【问题描述】:

我一直在创建一个安装脚本,仅用于在 Ubuntu Xenial Desktop 上安装代理和开发配置。

我有 2 个脚本都是交互式的,需要用户输入,我的挑战是每个脚本在安装后都需要重新启动,然后需要自动打开另一个控制台并与下一个脚本交互。

这是流程图:

  script_1.sh  >  reboot  >  script_2.sh 
       V                          V              
   usr input                  usr input               
   required                   required                 

我已经完成了所有脚本并按其应有的方式工作。我的挑战是尝试配置 Systemd,因此在重新启动后它将打开一个控制台并开始下一个脚本。

我对此并不陌生,但我使用 rc.local 构建了一些东西,然后阅读了大量帖子,说将它用于此类安装不是一个好习惯,我开始使用 upstart,然后我发现它已被弃用,我我需要使用 Systemd。

显然,我会构建这些脚本,然后将它们复制进去并在此过程中完成后将其删除,这是之前的尝试,任何关于如何做到这一点的帮助都会很棒,因为我已经失去了 2 天的时间。

之前的尝试:

description     "install script"

start on local-filesystems or runlevel [2345]
stop on runlevel [!2345]

pre-start script
    # prepare environment
    touch /var/logs/DID.log
    exec echo DID installation started  `date` >> /var/log/DID.log
end script

script
    # do some stuff
    exec ~/Documents/script_2.sh
    console output
end script

post-stop script
    # clean up
    exec echo DID stage 2 installation finished  `date` >> /var/log/DID.log
end script

为您提供的任何帮助提前欢呼。

【问题讨论】:

  • 您已经在重新启动,为什么您的脚本需要进一步重新启动??
  • are all interactive and require input from the user, 我不认为这是做事的写方式。相反,您应该使用配置文件并使这些启动脚本非交互式..
  • 第一个脚本正在配置内部代理和域凭据的设置,在使用它之后,我发现确保它能够恢复的最简单方法是重新启动系统。我可以结合最后 2 个脚本,这将使它更容易,并且不需要第二次重新启动,我越想它就越有信心重新启动。
  • 我已经尽我所能做到了,但所需的输入是域凭据和团队隶属关系以及其他我无权从其他系统中提取并自动进入的点点滴滴脚本,此时,并非所有开发人员都将使用 Linux。

标签: linux bash scripting systemd upstart


【解决方案1】:

您可以创建可能对您有所帮助的用户 systemd 脚本 (https://wiki.archlinux.org/index.php/Systemd/User)。

这是一个简短示例,说明如何从 systemd (目前不在 Ubuntu 上,因此不确定这是否适用于路径)在终端中启动脚本进入 systemd 用户文件夹,可能是 /etc/systemd/用户/:

[Unit]
Description=Start Script in terminal

[Service]
ExecStart=/usr/bin/xterm -hold -e /path/to/your/script.sh

[Install]
WantedBy=graphical.target

这将在我的系统(Arch)上使用systemctl --user start servicename.service为我运行

一旦你有一个完整的图形环境,诀窍就是让它启动(使用我给出的脚本,如果你运行systemctl --user enable servicename.service,它几乎肯定会在你的窗口管理器之前启动,因为我不在 Ubuntu 中,我可以'不测试)。这可能会有所帮助(最后回复):https://superuser.com/questions/759759/writing-a-service-that-depends-on-xorg。他们是一个 Ubuntu 用户,在登录后获得了 systemd 服务来运行图形程序。

如果您能确定启动超时,您可以创建服务文件,在第一个脚本结束时创建/启用它,然后在第二个脚本结束时禁用/删除它。

【讨论】:

  • 太棒了,它可以帮助我看到我现在哪里出错了,干杯! :)
  • 这不起作用,并在 syslogd 中给我一个讨厌的错误 - 而且我在运行时已经登录:“警告:此程序是 suid-root 程序或正在由root 用户。错误或警告消息的全文无法在此环境中安全地格式化。您可以通过以非 root 用户身份运行程序或删除可执行文件上的 suid 位来获得更具描述性的消息。/usr/ bin/xterm: Xt 错误: 无法打开显示: %s /usr/bin/xterm: DISPLAY is not set"
猜你喜欢
  • 2018-06-07
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多