13

I've written a Bash script that runs four long-running (20-30 minutes each) processes:

terminator -T "<NAME-1>" -e "<COMMAND-1>" &
terminator -T "<NAME-2>" -e "<COMMAND-2>" &
terminator -T "<NAME-3>" -e "<COMMAND-3>" &
terminator -T "<NAME-4>" -e "<COMMAND-4>" &

(where <COMMAND-X> is a value created by several lines of Bash beforehand, including calls to Kubernetes).

When I run my script, each of these processes opens in a new Terminator window. To avoid having four new windows spawn each time I run the script, I'd actually like them to all start in different views of a single new window. Is there any way to do this? There's nothing in the manual.

I'd accept a solution that uses a different terminal.

2 Answers2

12

First, open a terminator instance, split it into 4 panes as desired and save as a new layout (make sure to close all open terminal windows except the one you've set up with your new profile). For each of the 4 panes, add a custom command but just add the text COMMAND1, COMMAND2 etc. Save the new layout as foo (or whatever). At this point, your ~/.config/terminator/config should look something like this:

[global_config]
  enabled_plugins = LaunchpadCodeURLHandler, APTURLHandler, LaunchpadBugURLHandler
  focus = mouse
  suppress_multiple_term_dialog = True
  title_use_system_font = False
[keybindings]
[layouts]
  [[default]]
    [[[child0]]]
      fullscreen = False
      last_active_term = ad14f6cd-bcc3-4a80-9852-3fe64f7fc2eb
      last_active_window = True
      maximised = False
      order = 0
      parent = ""
      size = 735, 474
      title = sometitle
      type = Window
  [[foo]]
    [[[child0]]]
      fullscreen = False
      last_active_term = 18ebf009-c427-4c2f-8017-78c379a72d31
      last_active_window = True
      maximised = False
      order = 0
      parent = ""
      position = 2730:254
      size = 735, 474
      title = NAME-1
      type = Window
    [[[child1]]]
      order = 0
      parent = child0
      position = 237
      ratio = 0.5
      type = VPaned
    [[[child2]]]
      order = 0
      parent = child1
      position = 368
      ratio = 0.500680272109
      type = HPaned
    [[[child5]]]
      order = 1
      parent = child1
      position = 368
      ratio = 0.500680272109
      type = HPaned
    [[[terminal3]]]
      command = COMMAND1
      order = 0
      parent = child2
      profile = default
      title = NAME-1
      type = Terminal
      uuid = 01e46a5a-0a12-4861-a81e-e376af6041a7
    [[[terminal4]]]
      command = COMMAND2
      order = 1
      parent = child2
      profile = default
      type = Terminal
      uuid = 094d544d-944c-48a7-9960-00370253e799
    [[[terminal6]]]
      command = COMMAND3
      order = 0
      parent = child5
      profile = default
      type = Terminal
      uuid = fe19f601-1963-4af7-8870-f90e289d3d27
    [[[terminal7]]]
      command = COMMAND4
      order = 1
      parent = child5
      profile = default
      type = Terminal
      uuid = 18ebf009-c427-4c2f-8017-78c379a72d31
[plugins]
[profiles]
  [[default]]
    cursor_color = "#aaaaaa"
    font = Monaco 11
    scrollback_infinite = True
    scrollback_lines = 5000
    use_system_font = False

Now, modify your bash script to replace COMMANDN with the actual command you need to run:

#!/bin/bash

## change these to whatever you actually need
command1="echo one; bash"
command2="echo two; bash"
command3="tail -f /var/log/messages; bash"
command4="top"

## Modify terminator's config
sed -i.bak "s#COMMAND1#$command1#; s#COMMAND2#$command2#; s#COMMAND3#$command3#; s#COMMAND4#$command4#;" ~/.config/terminator/config

## Launch a terminator instance using the new layout
terminator -l foo

## Return the original config file
mv ~/.config/terminator/config.bak ~/.config/terminator/config

Running that script will now open a new terminal window with 4 panes, each running one of your commands.

Important: if the command is something that runs and then exits (as opposed to something like top which runs until you tell it to stop), you need COMMAN; bash as the command so that a new shell will be started. Otherwise, the command will run and the shell will exit immediately. That's why I have ; bash after each command except top in y script.

terdon
  • 100,812
  • IIRC terminator has a habit of writing current config to disk when quitting, so if I make changes to the config using an editor while terminator is still running, and then restart terminator, I get the pleasant surprise of seeing none of my modifications take effect. – muru Jan 09 '17 at 14:02
  • @muru there are some such weird things yes. I think I had to close all open terminal windows when first creating the new layout. Hang on, let me add a note about that. – terdon Jan 09 '17 at 14:03
  • Although you are missing the command to create the config.bak. – Ben Watson Jan 09 '17 at 14:39
  • @BenWatson no, the sed command creates the config.bak. That's what the -i.bak does. – terdon Jan 09 '17 at 14:59
  • That's interesting, I had to add a line to make the bak else it wasn't resetting properly. I'll investigate sometime. – Ben Watson Jan 09 '17 at 15:04
  • @BenWatson that wouldn't have been the problem (unless you're not actually running Linux, OSX and BSD sed behave differently). The -i.bak will always create the .bak file. I would guess your problem was terminator being finicky with its config file, you hadn't closed all open instances or something like that. – terdon Jan 09 '17 at 15:09
5

Alternative:

Since you've mentioned that you'd accept alternative solution, consider using gnome-terminal. In the past I've written scripts for that, which allow spawning window with multiple tabs and running their own commands. Please see this for example: https://askubuntu.com/a/863179/295286

As for terminator itself, it seems like it allows spawning new tabs for already existing window via --new-tab option, but I see no option to spawn multi-tab window with individual commands other than via --layout option. You can automate it, of course, since layouts are all go into ~/.config/terminator/config file, so you could write out custom config file. I'll try to write one if I won't forget, but I think gnome-terminal approach is far simpler and is exactly what you want.

Original answer

Terminator has a layout preference, which you can use with specific number of tabs, splits, and assign specific color profiles to them. What you want to do is to open window , add how ever many tabs you want, and then right-click, go to Preferences , layouts tab, and click add button

enter image description here

Once you're done editing layout, save it. Now you can call use terminator -l <Layout Name> to spawn window with that exact set of tabs. For instance, from my screenshot you can see I have custom layout, so I would use terminator -l custom

Sergiy Kolodyazhnyy
  • 105,154
  • 20
  • 279
  • 497
  • That seems like a step forward thanks, however if I add -l custom to my four terminator commands, I just end up with four separate windows (each of which is split into four views), with only the top-left view of each populated. How can I force each command to go into the same window? – Ben Watson Jan 09 '17 at 09:21
  • @BenWatson Take a look at the screenshot. You can assign custom command to each terminal tab. I would recommend that you use it like so : bash -c "COMMAND 1 ; bash" and just repeat that for each command. That way we're ensuring the window won't close if the command is short-lived – Sergiy Kolodyazhnyy Jan 09 '17 at 09:30
  • I can't use the Terminator custom commands box because the script does a few other things beforehand to populate the <COMMAND> fields. Of course I could have the custom command: box run scripts themselves... It's not massively elegant as I can't just tell others to check out and run one script, but it could be the best solution. I'll give it a day to see if anyone else has a solution, else I'll select this. Thanks. – Ben Watson Jan 09 '17 at 09:35
  • I'll take a look at man page, will let you know if i come up with something. As alternative, gnome-terminal can do what you want, i know that for a fact because I've written scripts like that myself before – Sergiy Kolodyazhnyy Jan 09 '17 at 09:38
  • @BenWatson that isn't exactly clear, I agree with terdon, but I sort of know what you are trying to do. I'd sure recommend you edit the question - other users might find your question unclear and close it – Sergiy Kolodyazhnyy Jan 09 '17 at 09:43
  • gnome-terminal looks good. I'd rather be able to see all commands at the same time in views rather than tabs, but again if that's the best after a day I'll accept it. – Ben Watson Jan 09 '17 at 09:56