2

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:

$HOME/tdm.sh

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:

tdm

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?

Update

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 Feb 17 '18 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. – user9303970 Feb 17 '18 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 Feb 17 '18 at 16:26
  • @terdon I want it to be done in another session without &, then I just run the function without special arguments... – user9303970 Feb 17 '18 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 Feb 17 '18 at 17:21
2
+50

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

nohup

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/"
}
1

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. – user9303970 Feb 17 '18 at 23:07
  • Please review the question. – user9303970 Feb 18 '18 at 1:39
0

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. – user9303970 Feb 16 '18 at 20:30
-1

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. – user1133275 Feb 27 '18 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. – user9303970 Mar 3 '18 at 21:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.