Tmux - Execute command in session on startup
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 videos on Youtube
Comments
-
Locane over 1 year
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.
-
Locane over 9 yearsHey JohnKiller - thanks for the suggestion, it made me realize the answer and I implemented it. You may want to edit your answer though, the "-z" Bash if test is for zero-length - your if statement says "If TMUX is not running, do this", but my question was about executing a command in TMUX after it begins running.
-
dwanderson over 7 yearsGreat solution! Instead of needing to touch a new file (and remember to remove it, or to have it work across multiple terminals with
tmux
at once), I changed it to:if [[ -n "$TMUX" ]] && [[ -z $ALREADY_RAN_TMUX_STARTUP ]]; then export ALREADY_RAN_TMUX_STARTUP=true; /usr/bin/hello_world
. YMMV; your answer got me what I needed, so thanks! -
Jim Pedid about 6 yearsHow can I use this to create a named session in tmux at startup?
-
Locane about 6 years@JimPedid you could add a line to rename the tmux session once it's active: after the "touch /root/.automatic_start_occurred" line, you could add
tmux rename-session TestSession