December 2, 2021 13:58
The command itself
mkdir -p /tmp/[SESSION_NAME]/; mkfifo /tmp/[SESSION_NAME]/IN; nohup bash -c "while [ -e /tmp/[SESSION_NAME]/IN ]; do cat /tmp/[SESSION_NAME]/IN; sleep 0.4; done | bash -c \"echo \$ > /tmp/[SESSION_NAME]/PID; [SESSION_COMMAND]; echo \"End\" > /tmp/[SESSION_NAME]/IN; rm /tmp/[SESSION_NAME]/IN\"" > /tmp/[SESSION_NAME]/OUT 2>&1 </dev/null &
Make sure to fill in the following placeholders!
[SESSION_NAME]An unique name of the session - maybe useuuidgen.[SESSION_COMMAND]The command to run inside the session.
Usage
The above command will create a new folder on /tmp/[SESSION_NAME]/ with a pipes IN and a file OUT in it.
You can e.g. pipe a command into the session with echo "help" >> /tmp/[SESSION_NAME]/IN (example if session is running a bash) and receive the result by reading the /tmp/[SESSION_NAME]/OUT file.
To constanty monitor the result use e.g. tail -f /tmp/[SESSION_NAME]/OUT.
Also a file called PID is created, containing the process id of the parent bash - this is to detect whether the session is still alive.
How it works
Lets go over the command and look at every detail of it:
mkdir -p /tmp/[SESSION_NAME]/; mkfifo /tmp/[SESSION_NAME]/IN;Prepare the folder for the session and also create the input pipe.nohup bash -c "..." > /tmp/[SESSION_NAME]/OUTCreate the parent bach and pipe the output to the file…while [ -e /tmp/[SESSION_NAME]/IN ]; do cat /tmp/[SESSION_NAME]/IN; sleep 0.4; done ...Try to read the pipe and only echo the line if it is completed with a newline char\n.... | bash -c \"echo \$ > /tmp/[SESSION_NAME]/PID; [SESSION_COMMAND]; echo \"End\" > /tmp/[SESSION_NAME]/IN; rm /tmp/[SESSION_NAME]/IN\"- Put the parents bash PID into the sessions folder…
- Take the input of the command before and pipe it into the executed session command.
- Just output one more line, so the while loop gets unblocked and the
catcommand ends… - Remove the input pipe (signal for
whileto end, also makes sure no program could freeze, because it tries to write into a dangling pipe).
Possible upgrades
- Move name and the command into variables, so they can be requested or updated on-the-fly…