Home > Software engineering >  node myapp.js > myapp_error.log 2>&1 equivalent when is starting as service
node myapp.js > myapp_error.log 2>&1 equivalent when is starting as service

Time:12-03

A simple testing app called myapp:

const fs = require("fs");
const json_encode = require('json_encode');

//emulate a real error
var wrong;
var test = json_encode(wrong);
//TypeError: Cannot read property 'replace' of undefined at json_encode... 

If I try to save myapp_error.log for myapp from command line I use:

node myapp2.js > myapp_error.log 2>&1
//myapp_error.log is created and I can read the error logged

I need to do the same but if I starting myapp as service in /etc/systemd/system like

systemctl start myapp

The service (tested and running ok):

[Unit]
Description=myapp

[Service]
ExecStart=/path/to/myapp/myapp.js
Restart=my_username
User=nobody
Group=www-data
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/path/to/myapp

[Install]
WantedBy=multi-user.target

I have tried:

ExecStart=/path/to/myapp/myapp.js > myapp_error.log 2>&1 (this do nothing)

also tried:

systemctl start myapp > myapp_error.log 2>&1 (this write a empty file myapp_error.log in /etc/systemd/system)

CodePudding user response:

The [Service] block in your unit file has options for stdout/stderr logs:

StandardOutput=append:/path/to/stdout.log
StandardError=append:/path/to/stderr.log

Edit (from comments discussion):

Running node itself was also missing:

ExecStart=/usr/bin/node /path/to/myapp/myapp.js

Systemd doesn't know what to do with a JS file, so we need to call the correct interpreter first.

  • Related