linuxbashshelldebianheadless

Automatically starting script in foreground on headless debian


Does anyone know any way of doing this? The help would be greatly appreciated, I've been beating my head over this one for a while now, and I can't seem to find any way to get scripts to auto-start and display in the foreground as they would if I had manually started them.

what i want to do is basically just power on the vm, let it boot, then watch the script run and echo results to the console or whatever the script would normally display if ran manually

I've been able to use Cron and systemd to run the script I would like to run at startup, but I cannot figure out any way to get these scripts to run in the screen, as they would if I had typed ./startup_script.sh

i am currently testing everything in a headless Debian 11 vm. Auto login as root is already enabled. i just need to complete this last step but i don't know how to do.


Solution

  • You can fire up a tmux session and send keys it to start a script like this:

    tsid="session_name"
    my_script="/home/script.sh"
    
    # create new tmux session
    tmux new-session -d -s ${tsid}
      
    # launch the script in the tmux session
    echo "launching script in a tmux session called ${tsid}"
    tmux send-keys -t ${tsid} "${$my_script}" 'C-m'
    

    I do something similar to start a "quad-pane" to my raspberry pi devices. I can send commands to each pane via ssh without looking at the screen I am sending commands to. I can send commands to the panes from any ssh session without actually connecting to a gui, or being in the "session". This way, another machine can have that session up on a monitoring display and I can momentarily ssh over a command to the host and it will show over there without ever actually connecting to the window. The panes can run scripts and and have the output on the each respective screen/pane waiting for me to connect later and look at it. Every now and then I'll pull up my quad feed to see what's happening... then disconnect and leave it all running.

    # function to send an arbitrary command to a tmux pane
    # arg1: full id of pane, e.g. "pi4-host01:quad-feed.0"
    # arg2+ command(s) to send to pane
    tmux_send_command_to_pane_id() {
      local tpid cmd
      tpid="${1:-0}"
      cmd="${@}"
      echo "cmd to send to pane: ${tpid}: ${cmd}"
      tmux send-keys -t "${tpid}" "${cmd}" 'C-m'
    }
    

    If you pair something like this with cron or systemd, i'd imagine you could get to your goal relatively quick. It does depend on installing tmux. I know others use screen, but I have become a fan of tmux for whatever reason.

    A nice answer on systemd scripts here -> https://unix.stackexchange.com/a/47715/376937

    Here is another question that may help as well: Tmux command to run shell command on active pane?