如何在启动时运行两个shell脚本?

时间:2018-01-25 08:20:04

标签: linux bash shell ubuntu cron

我正在使用Ubuntu 16.04,我有两个shell脚本:

  1. run_roscore.sh:这个在一个终端点燃了一个roscore。
  2. run_detection_node.sh:这个启动另一个终端中的对象检测节点,并且应该在 run_roscore.sh 初始化roscore后启动。
  3. 我需要在系统启动后立即执行这两个脚本。

    我使两个脚本都可执行,然后将以下命令添加到cron: @reboot /path/to/run_roscore.sh; /path/to/run_detection_node.sh,但它没有运行。

    我还尝试使用此命令将两个脚本添加到启动应用程序中,用于roscore:sh /path/to/run_roscore.sh,并执行以下检测节点命令:sh /path/to/run_detection_node.sh。它仍然无效。

    如何让这些脚本运行?

    编辑:我使用以下命令查看CRON进程的系统日志:grep CRON /var/log/syslog并得到以下输出:

    CRON[570]: (CRON) info (No MTA installed, discarding output)

    所以我安装了MTA然后系统日志显示: CRON[597]: (nvidia) CMD (/path/to/run_roscore.sh; /path/to/run_detection_node.sh)

    我仍然无法看到输出(应该是带有检测的摄像机流,正如我在终端中直接运行脚本时所看到的那样)。我该怎么办?

3 个答案:

答案 0 :(得分:1)

自从我最终开始工作以来,我将在这里回答我自己的问题。

我执行了以下步骤来使脚本从启动运行:

  • 将脚本的类型从shell更改为bash(扩展名.bash)。
  • 将shebang语句更改为#!/bin/bash
  • 在“启动应用程序”中,输入命令bash path/to/script以运行脚本。

基本上,当我将外壳类型从sh更改为bash时,脚本会在系统启动后立即开始运行。

请注意,以防万一:某人将run_roscore.bash作为单独的脚本的意图是将roscore作为后台进程运行。在rosnode启动之前,可以通过使用roscore&作为命令,从单个脚本(也正在运行检测节点)直接运行它。该命令将启动主机作为后台进程,并保持同一终端打开以执行以下命令。

答案 1 :(得分:0)

如果您可以安装immortal,则可以使用require选项按顺序启动您的服务,例如,这可能是/etc/immortal/script1.yml的{​​{3}}配置:

cmd: /path/to/script1
log:
    file: /var/log/script1.log
wait: 1
require:
  - script2

适用于/etc/immortal/script2.yml

cmd: /path/to/script2
log:
    file: /var/log/script2.log

这样做会尝试在启动时启动两个脚本,第一个脚本script1将在启动前等待1秒,并等待script2启动并运行,详情请参阅这里有waitrequire选项:run

根据您的操作系统,您需要配置/设置https://immortal.run/post/immortal/,她是如何为Linux执行的:immortaldir

在主管的主题中更深入了解你可以找到更多的替代方案:https://immortal.run/post/how-to-install/

答案 2 :(得分:0)

如果你想确保" Roscore" (无论是什么)在你的Ubuntu启动时启动,然后你应该将它作为服务启动(而不是通过cron)。 请参阅此question/answer