I use Ubuntu 16.04 with Bash and I have a file that contains many different functions. In between these functions, there is this one:

tdm() {
    chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/
    sleep 2h
    chmod -R 000 "$drt"/phpmyadmin/
    tmux kill-session

This function exists because after I install phpmyadmin (PMA), I restrict it by chmod /usr/share/phpmyadmin 000 -R for security reasons, and the above function uses me to temporarily permit PMA, for 2 hours (2 hours is usually more than enough for me to do my changes in the database). Hence the name TDM (temporary Database Management).

Note that this function has no call. It has none because I call it directly from the CLI via executing tdm, after sourcing the file that contains it.

My problem

My problem is that the sleep command inside the function prevents me from using the console (any foreground change will stop sleep).

I thus need tdm to be executed in a detached tmux session, there it will change permissions to 755/644, sleep 2 hours (without interrupting my work in the console), then it will lock PMA again, and kill the detached tmux session.

The only reason I use tmux here is so that the sleep utility won't interrupt the current session that I work with, as described above.

What I contemplated so far

1 - Using Bash background instead tmux:

I could remove the tmux part and call the function in the background with & but I don't want that; I desire not to use any arguments when running the function.

2 - A dedicated file:

One way to run tdm in a detached tmux session is to put the subroutine in a script in a dedicated file, then creating an alias for that file, and run it directly:

1) Create a dedicated file:


2) Add an alias to "$HOME"/.bashrc:

alias tdm="tmux new-session -d 'bash $HOME/tdm.sh'"

3) Source bashrc:

source "$HOME"/.bashrc

4) use the alias:


Yet I don't want to put the function in a script in a dedicated file; I want to keep it its current file that contains other functions.

My question

How could I run the function from inside the file containing other functions, in a detached tmux session?


A disown or nohup solution might be good. As long as I run the function only with tdm without arguments, then I don't care if it's done with disown, nohup or tmux.

  • Why not simply make your tmux command do bash -c 'source file-with-all-functions; tdm'?
    – meuh
    Commented Feb 17, 2018 at 8:52
  • I already sourced the file and the function is named tdm so I just want to run it with tdm (as I can), but I just need it to run in a detached tmux session. Commented Feb 17, 2018 at 9:25
  • Why don't you just run tdm &? Send it to the background and you don't need to wait for it. Do you really need it in a tmux session? That seems like pointless overhead.
    – terdon
    Commented Feb 17, 2018 at 16:26
  • @terdon I want it to be done in another session without &, then I just run the function without special arguments... Commented Feb 17, 2018 at 16:50
  • Please clarify why you need this to be done using tmux. There are various other way, you can use a subshell, send it to the background, disown, nohup, tmux is the most complex and resource intensive of all of them.
    – terdon
    Commented Feb 17, 2018 at 17:21

4 Answers 4


Use at;

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  echo "chmod -R 000 \"$drt\"/phpmyadmin/" | at "now + 2h"

or sleep with


tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  nohup "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/" &

or screen

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  screen -S tdm -d -m "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/"

or tmux

tdm() {
  chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/ && \
  tmux new -d -s tdm "sleep 2h; chmod -R 000 \"$drt\"/phpmyadmin/"

If I understand what you are trying to do, you're using a tool too powerful for the job. Instead of spawning a dedicated tmux session just for a single simple script, run that script from the command line using nohup & and disown.

nohup tdm DRT & disown
  • I need a solution from within the function. Commented Feb 17, 2018 at 23:07
  • Please review the question. Commented Feb 18, 2018 at 1:39

Not sure this is what you asked for, but you can directly pass in parameter the commands you want to run in the deteached session :

tmux new-session -n:myTest 'chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/;sleep 2h;chmod -R 000 "$drt"/phpmyadmin/'
  • I've edited the question to hopefully make it clearer. You are very welcome to review the question and edit accordingly. Commented Feb 16, 2018 at 20:30

In the comments, the user Rich offered the following solution but desired not to publish an answer.

I understand he meant this:

tdm() {
    chmod -R a-x,a=rX,u+w "$drt"/phpmyadmin/
    echo "chmod -R 000 $drt/phpmyadmin/" | at now + 2 hours
  • Both your answer and Rich's comment are 5 hours after the bonus receiving answer. If you want people to upvote your Q/A you should play nicer; give credit to the answer that was most correct and is not your own. Commented Feb 27, 2018 at 11:27
  • Did you downvote my answer? I don't track any update on any answer. I upvoted your answer and gave you bounty because at the time it seems the best but I don't recall it helped me and I might missed something. Commented Mar 3, 2018 at 21:10

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .