Manage PM2 Processes From an iPhone or iPad

PM2 keeps Node processes alive, which means the moment you actually need it is the moment something has gone wrong — an app is restarting in a loop, memory has crept up, or a deploy left a process stopped. Those moments rarely coincide with sitting at a desk. The commands themselves are short, but typing pm2 logs api --lines 200 on a software keyboard while standing on a platform is its own kind of punishment, and reading the output in a 6-inch terminal is worse. A dashboard over the same SSH connection solves the ergonomics without changing the mechanism.

Written by the GateShell team at Hefty Innovations

Step by step

  1. 1

    Connect to the server that runs PM2

    Nothing special is required. PM2 is detected on the server you are already connected to, using the same SSH credentials, so there is no agent to install and no port to open for this. If PM2 is installed under a specific user, connect as that user — PM2's process list is per-user, and connecting as root will show you root's empty list rather than your application's processes. This trips people up far more often than any genuine fault.

  2. 2

    Read the process list before you touch anything

    The list gives you name, status, uptime, restart count, CPU, and memory per process. Read it before acting, because it usually contains the answer. A process showing online with a restart count in the hundreds is not healthy; it is crash-looping and PM2 is dutifully restarting it. Uptime that resets every few seconds tells you the same story. The status column alone will mislead you here, which is why the restart count is the number worth looking at first.

  3. 3

    Go to the logs, not to the restart button

    The reflex is to restart. Resist it for thirty seconds and read the logs first, because restarting destroys the evidence and, if the cause is a bad config or a missing environment variable, changes nothing. Pull the recent output for the specific process and look for the stack trace at the point of the first failure rather than the most recent one — a crash loop fills the log with identical repetitions of the same error, and the useful line is at the start.

  4. 4

    Restart or reload, deliberately

    These are not the same operation. A restart stops and starts the process, dropping in-flight requests. A reload performs a zero-downtime rolling restart, but only for apps running in cluster mode; issuing it against a fork-mode process quietly behaves like a restart. If you are on a phone because something is already broken, a restart is usually the honest choice. Reload is for deploying a change to a healthy clustered app.

  5. 5

    Check that the fix held

    Restarting something is not the same as fixing it, and a phone makes it tempting to declare victory and put the device away. Come back to the process list after a minute. Uptime should be climbing and the restart count should be static. If the count is rising again, the restart did not address the cause and you have a config or dependency problem waiting on a real keyboard.

  6. 6

    Make the next incident find you instead

    If you are repeatedly discovering PM2 problems by chance, the optional self-hosted agent turns that around. It collects metrics on a schedule, tracks service up/down transitions, and sends push alerts for the states you care about. It runs on your own server and stores its history there. This does not make PM2 more reliable, it just means you hear about a stopped process from a notification rather than from a user.

Frequently asked questions

Do I need to install anything on the server?+

Not for the dashboard. It works over your existing SSH connection and reads the state PM2 already exposes. The optional self-hosted Go agent is a separate, opt-in component, and it is only needed if you want scheduled metric collection and push alerts rather than on-demand checks.

Why is my process list empty when PM2 is definitely running?+

Almost always because you are connected as a different user than the one that started PM2. PM2 maintains a separate daemon and process list per user, so connecting as root when the app runs as deploy shows an empty list rather than an error. Connect as the owning user.

What is the difference between restart and reload?+

Restart stops and starts the process, so in-flight requests are dropped. Reload does a rolling zero-downtime restart across cluster workers. Reload only behaves that way for apps in cluster mode — against a fork-mode process it effectively degrades to a restart, which surprises people who assumed it was always safe.

Can I see logs for one process rather than everything?+

Yes, logs are per-process from the dashboard. This matters more on a phone than on a desktop, because an interleaved log stream from a dozen processes is close to unreadable on a narrow screen.

Does this work for Docker, Nginx, and databases too?+

Yes. PM2 is one of 20+ auto-detected service dashboards, alongside Docker, Nginx, Redis, PostgreSQL, MySQL, MongoDB, Caddy, Traefik, and others. Detection is based on what is actually present on the server, so you only see dashboards for services you run.

Try it in GateShell

GateShell is a zero-backend SSH client for iPhone, iPad, and Mac, with no vendor cloud, no accounts and no telemetry. Everything above works out of the box.

Guide reflects GateShell's shipped features as of September 2026. Steps assume basic familiarity with SSH and the command line; server-side commands may vary by distribution. All product names, logos, and brands are property of their respective owners.