Self-Hosted Github Runner: start a background server process in a job and let it run after the job ends

Viewed 1666

I am trying to do the following:

  • In a Self-hosted runner, run a server process. Invoke it using curl. This process monitors something during the execution of the next "another job"
  • Run "another job" (not on Self-hosted runner)
  • In the Self-hosted runner, call curl again to collect statistics.

I have the following jobs in my Github Actions workflow:

start-process:  # THIS JOB IS SUPPOSED TO START A SERVER IN BACKGROUND
    name: Start
    needs: start-runner # previous job starts the runner
    runs-on: ${{ needs.start-runner.outputs.label }} # run the job on the newly created runner
    steps:
      - uses: actions/checkout@v2
      - name: npm install
        working-directory: ./monitor
        run: npm install
      - name: npm start
        run: nohup npm start & # this starts the server in background
        working-directory: ./monitor
      - run: curl http://localhost:8080/start
      - run: ps aux


anotherjob:
  // perform another job...

and according to ps aux I have my server process there:

root      4746  4.8  1.2 721308 48396 ?        Sl   11:20   0:00 npm
root      4757 85.8  4.9 736308 196788 ?       Sl   11:20   0:04 node /actions-runner/_work/<myrepo>/<myrepo>/monitor/node_modules/.bin/ts-node src/main.ts
root      4773  0.0  0.0 124052  2924 ?        S    11:20   0:00 /usr/bin/bash -e /actions-runner/_work/_temp/51a508d8-9c2c-4723-9691-3252c8d53d88.sh

But in the Actions logs logs I have then under "Complete Job":

Cleaning up orphan processes
Terminate orphan process: pid (4731) (npm)
Terminate orphan process: pid (4742) (node)

So when I have another step

  statistic:
    name: Output Statistics
    needs:
      - start-runner
      - start-process
      - anotherjob
    runs-on: ${{ needs.start-runner.outputs.label }}  
 
    steps:
      - run: ps aux
      - run: curl http://localhost:8080/statistics

and this fails: ps aux has no process anymore and curl can not connect to the address.

Question: how within the first job can I launch a process that stays on the runner after the job ends?

1 Answers

Turns out that in order to "protect" process from cleanup, it can be run as

run: RUNNER_TRACKING_ID="" && (nohup npm start&).

This suggestion was found in this thread on GitHub.

Related