post · 08 Nov 2022 · 1 min read

How to keep a Go script running on SSH plus how to kill it

Introduction

If you want to host some ever-running script, what option do you have?

  1. Run on your laptop, and never sleep / off it (??)
  2. Get a Raspberry Pi (ugh.. overkill)
  3. Pay a few dollars to host it somewhere (few dollars to host something so small.. worth?)
  4. Ask your friend to run on his/her laptop and never off it.

Option 4 seems to be the best option if you manage to convince.

Fortunately I have the opportunity of abusing my personal VM at work. I mean, not abusing, it’s somewhat related to work too. I’m sure.

How

These are roughly the steps I took:

Clone the repo

Clone the repo into the VM. My path is ~/xuanbot.

Start running, but..

We cannot just run it with the usual go run main.go, because if we do that, the process will hang up when we exit the ssh conenction.

Instead, we can do

$ nohup go run main.go &

xuanze.ang@n36-172-051:~/xuanbot$ nohup go run main.go &
[1] 670740
xuanze.ang@n36-172-051:~/xuanbot$ nohup: ignoring input and appending output to 'nohup.out'

At this point, the process is running.

Find the process id

Next, we need to know what is the process id of our task.

$ ps -ef | grep go

xuanze.ang@n36-172-051:~/xuanbot$ nohup: ignoring input and appending output to 'nohup.out'
ps -ef | grep go
root        1411       1  0 Nov07 ?        00:01:56 /etc/sysop/mongoosev3-agent/mongoosev3-agent
root        3888    1411  0 Nov07 ?        00:00:36 /etc/sysop/mongoosev3-agent/plugin/driver/driver
root        3896    1411  0 Nov07 ?        00:00:07 /etc/sysop/mongoosev3-agent/plugin/journal_watcher/journal_watcher
root        3945    1411  0 Nov07 ?        00:01:02 /etc/sysop/mongoosev3-agent/plugin/collector/collector
root        4016    1411  0 Nov07 ?        00:00:49 /etc/sysop/mongoosev3-agent/plugin/baseline/baseline
xuanze.+  670740  670583  0 11:32 pts/0    00:00:00 go run main.go
xuanze.+  670844  670740 99 11:32 pts/0    00:00:37 /tmp/go-build2256816827/b001/exe/main
xuanze.+  671173  670583  0 11:32 pts/0    00:00:00 grep go

We can see that our build is running as pid 670844 for 37 seconds now.

Kill it

Since we have enough information now, kill it!

kill 670844

Process should now be killed and removed from the list. Done!

Bonus

Useful command to move a file from local to ssh machine.

scp <origin file path> <name>@<host>:<destination file path>

$ scp /Users/xz/file.txt xuanze.ang@1.1.1.1/home/xuanze.ang
file.txt                           100%   11KB  47.6KB/s   00:00
Older postTrick to keep empty folders on git