Tmux – Execute command in session on startup

bashtmux

What I want to do is really simple, but I can't seem to find a straightforward answer.

I found this question and this question, but they're not quite what I need – I'm not running multiple sessions or windows or anything crazy like that – I just want tmux to execute a command (likely a bash script) within itself, after it opens.

So basically I type "tmux", a session opens, and within the session tmux automatically executes "hello_world.sh", or something similar.

Does anyone know how to do this? The .tmux.conf file doesn't seem to take "send-keys", but I might be using it wrong.

Thank you all in advance.

Edit: Answered my own question thanks to JohnKiller. I didn't think about the fact that /root/.bashrc is run on log in, AND when TMUX opens. I added an if statement to it, answer below.

Best Answer

Thanks to JohnKiller's suggestion, I realized that .bashrc executes both when a new tty is opened, and when TMUX is opened in a terminal.

For future readers: The $TMUX variable is typically referenced to see if TMUX is running at all, but you could also use "pidof tmux". The $TMUX variable will be populated with something like: "/tmp/tmux-0/default,27389,0" if TMUX is running.

In my particular case, I'm running CentOS 6, and have it set to auto-login with root since it's just a test image. I was able to do that by editing /etc/init/tty.conf:

exec /bin/mingetty --autologin root $TTY

Now that it's set to auto-login, I added the following to /root/.bashrc:

if [[ `tty` == "/dev/tty1" ]] && [[ -z "$TMUX" ]];then
        tmux
fi

For newbies reading this, this says "If my terminal is terminal 1, and the $TMUX variable is zero-length, run tmux".

It's followed by:

if [[ -n "$TMUX" ]] && [[ ! -e "/root/.automatic_start_occurred" ]];then
        touch /root/.automatic_start_occurred
        /usr/bin/hello_world
fi

Again for newbies, this says "If $TMUX is non-zero in length, and the file ".automatic_start_occurred" does not exist (the "!" in the if statement), make the file "/root/.automatic_start_occurred" and then execute "hello_world" in /usr/bin.

This is exactly what I was looking for my system to do - After booting, TTY1 will pop up with TMUX, and the other TTYs will be left alone. When TMUX pops up for the first time, it will execute some arbitrary commands, and never do them again unless the file ".automatic_startup_occurred" is removed.

Related Question