Giter VIP home page Giter VIP logo

node-linux's Introduction

node-linux

NPM version NGN Dependencies Build

Sponsors (as of 2020)

Follow the author on Twitter (@goldglovecb).

Contributions Requested

(see below)

Documentation is available at the node-linux portal.

This is a standalone module, originally designed for internal use in NGN. However; it is capable of providing the same features for Node.JS scripts independently of NGN.

For alternative versions, see node-windows and node-mac

This module makes it possible to daemonize Node.js scripts natively (using systemv init.d scripts).

To start, install node-linux via:

npm install node-linux

node-linux has a utility to run Node.js scripts as Linux daemons.

To create a service with node-linux, prepare a script like:

  var Service = require('node-linux').Service;

  // Create a new service object
  var svc = new Service({
    name:'Hello World',
    description: 'The nodejs.org example web server.',
    script: '/path/to/helloworld.js'
  });

  // Listen for the "install" event, which indicates the
  // process is available as a service.
  svc.on('install',function(){
    svc.start();
  });

  svc.install();

The code above creates a new Service object, providing a pretty name and description. The script attribute identifies the Node.js script that should run as a service. Upon running this, the script will be available to the system. By default, node-linux produces systemv init scripts, meaning the services can be managed by typing service myapp start or service myapp stop (or service myapp status in some cases).

Windows Mac

The Service object emits the following events:

  • install - Fired when the script is installed as a service.
  • alreadyinstalled - Fired if the script is already known to be a service.
  • invalidinstallation - Fired if an installation is detected but missing required files.
  • uninstall - Fired when an uninstallation is complete.
  • start - Fired when the new service is started.
  • stop - Fired when the service is stopped.
  • error - Fired in some instances when an error occurs.
  • doesnotexist - Fired when an attempt to start a non-existent service is detected.

In the example above, the script listens for the install event. Since this event is fired when a service installation is complete, it is safe to start the service.

Services created by node-linux are like other services running on Linux. They can be started/stopped using service myapp start or service myapp stop and logs are available (default is in /var/log).

Environment Variables

Sometimes you may want to provide a service with static data, passed in on creation of the service. You can do this by setting environment variables in the service config, as shown below:

  var svc = new Service({
    name:'Hello World',
    description: 'The nodejs.org example web server.',
    script: '/path/to/helloworld.js',
    env: {
      name: "HOME",
      value: process.env["USERPROFILE"] // service is now able to access the user who created its' home directory
    }
  });

You can also supply an array to set multiple environment variables:

  var svc = new Service({
    name:'Hello World',
    description: 'The nodejs.org example web server.',
    script: '/path/to/helloworld.js',
    env: [{
      name: "HOME",
      value: process.env["USERPROFILE"] // service is now able to access the user who created its' home directory
    },
    {
      name: "TEMP",
      value: path.join(process.env["USERPROFILE"],"/temp") // use a temp directory in user's home directory
    }]
  });

Setting run as user/group

By default your node service will run as root:root. You may not want that. Just pass the requested user/group values at startup

  var svc = new Service({
    name:'Hello World',
    description: 'The nodejs.org example web server.',
    script: '/path/to/helloworld.js',
    user: "vagrant",
    group: "vagrant"
  });

Cleaning Up: Uninstall a Service

Uninstalling a previously created service is syntactically similar to installation.

  var Service = require('node-linux').Service;

  // Create a new service object
  var svc = new Service({
    name:'Hello World',
    script: require('path').join(__dirname,'helloworld.js')
  });

  // Listen for the "uninstall" event so we know when it's done.
  svc.on('uninstall',function(){
    console.log('Uninstall complete.');
    console.log('The service exists: ',svc.exists());
  });

  // Uninstall the service.
  svc.uninstall();

The uninstall process only removes process-specific files. It does NOT delete your Node.js script, but it will remove the logs!

What Makes node-linux Services Unique?

Lots of things!

Long Running Processes & Monitoring:

There is no built-in service recovery in most Linux environments, and third party products can be fairly limited or not easily configured from code. Therefore, node-linux creates a wrapper around the Node.js script. This wrapper is responsible for restarting a failed service in an intelligent and configurable manner. For example, if your script crashes due to an unknown error, node-linux will attempt to restart it. By default, this occurs every second. However; if the script has a fatal flaw that makes it crash repeatedly, it adds unnecessary overhead to the system. node-linux handles this by increasing the time interval between restarts and capping the maximum number of restarts.

Smarter Restarts That Won't Pummel Your Server:

Using the default settings, node-linux adds 25% to the wait interval each time it needs to restart the script. With the default setting (1 second), the first restart attempt occurs after one second. The second occurs after 1.25 seconds. The third after 1.56 seconds (1.25 increased by 25%) and so on. Both the initial wait time and the growth rate are configuration options that can be passed to a new Service. For example:

  var svc = new Service({
    name:'Hello World',
    description: 'The nodejs.org example web server.',
    script: '/path/to/helloworld.js'),
    wait: 2,
    grow: .5
  });

In this example, the wait period will start at 2 seconds and increase by 50%. So, the second attempt would be 3 seconds later while the fourth would be 4.5 seconds later.

Don't DOS Yourself!

Repetitive recycling could potentially go on forever with a bad script. To handle these situations, node-linux supports two kinds of caps. Using maxRetries will cap the maximum number of restart attempts. By default, this is unlimited. Setting it to 3 would tell the process to no longer restart a process after it has failed 3 times. Another option is maxRestarts, which caps the number of restarts attempted within 60 seconds. For example, if this is set to 3 (the default) and the process crashes/restarts repeatedly, node-linux will cease restart attempts after the 3rd cycle in a 60 second window. Both of these configuration options can be set, just like wait or grow.

Finally, an attribute called abortOnError can be set to true if you want your script to not restart at all when it exits with an error.

How Services Are Made

node-linux uses the templates to generate init.d scripts for each Node.js script deployed as a service. This file is created in /etc/init.d by default. Additionally, a log file is generated in /var/log/<name> for general output and error logging.

Event Logging

A log source named myappname.log provides basic logging for the service. It can be used to see when the entire service starts/stops.

By default, any console.log, console.warn, console.error or other output will be made available in one of these two files.

Contributions

Due to some unforeseen life circumstances, I was not able to add all of the features I'd hoped to add before releasing this. I'll chip away at them over time, but I would be very interested in community contributions in the following areas:

  • systemd script generation
  • upstart script generation

I have also added a tag in the issues called feature request to keep a running to-do list.

If you are interested in working on one of these features, please get in touch with me before you start to discuss the feature.

License (MIT)

Copyright (c) 2013 Corey Butler

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

node-linux's People

Contributors

athieriot avatar coderaiser avatar coreybutler avatar fratuz610 avatar linuxbasic avatar razzziel avatar siarheidudko avatar xiaojue avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

node-linux's Issues

Combine node-windows, node-linux and node-mac into one package

Using them individually doesn't make sense for a cross-platform service / package.

Can you please abstract them into a package e .g. node-service that would rely on all node-windows, node-linux and node-mac and use the appropriate one when running it. Auto-detect the current platform should be obviously easy.

What do you think?

No user support for systemv

It appears when you set the service to run under a specific user account, it has no effect for systemv. A variable is set with the username in the init.d script, but it is never used.

Allow setting variable after

Hello,
Could you implement a way to parameterize the after variable?
You would need this to ensure the order to start the services

[Unit]
Description={{description}}
After={{After}}

Thank you for your attention, sorry for the inconvenience.

Node 6.2.0 - Error

Hi,

With Node 4.4.4 works very well. But in 6.2.0 happens this issue:

Installing in /home/ec2-user/Test forder...
path.js:7
throw new TypeError('Path must be a string. Received ' + inspect(path));
^

TypeError: Path must be a string. Received undefined
at assertPath (path.js:7:11)
at Object.dirname (path.js:1324:5)
at new daemon (/home/ec2-user/Test/system/daemons/node-linux/lib/daemon.js:208:30)
at Object. (/home/ec2-user/Test/install.js:10:13)
at Module._compile (module.js:541:32)
at Object.Module._extensions..js (module.js:550:10)
at Module.load (module.js:458:32)
at tryModuleLoad (module.js:417:12)
at Function.Module._load (module.js:409:3)
at Function.Module.runMain (module.js:575:10)

Support enabling and disabling services

Besides installing/uninstalling and starting/stopping a service, the user should be able to enable and disable it.

Use case: in my install.js right now I can only install and start my service, but I cannot schedule it for automatic start on every boot, so installation requires manual operation which I'd rather avoid. My target is to be able to run "sudo npm install -g http://my/host/my/package.tgz", and have everything automatically configured for me.

I'm working on this modification:

  • New enable property in the systemv module that runs 'update-rc.d '+this.label+' defaults'
  • New disable property in the systemv module that runs 'update-rc.d -f '+this.label+' remove'

systemv.js child_process.exec fails on RHEL6 and CentOS6

Hi, I have a situation where the start and stop methods in systemv.js fail as follows on RHEL6 and CentOS6:

...
Running /etc/init.d/myservice start...
/path/to/node_modules/node-linux/lib/systemv.js:282
if (err) throw err;
^
Error: Command failed: /bin/sh -c /etc/init.d/myservice start
at ChildProcess.exithandler (child_process.js:751:12)
at ChildProcess.emit (events.js:110:17)
at maybeClose (child_process.js:1015:16)
at Socket. (child_process.js:1183:11)
at Socket.emit (events.js:107:17)
at Pipe.close (net.js:485:12)

When I print the err object it looks like this:
{ [Error: Command failed: /bin/sh -c /etc/init.d/myservice start]
killed: false,
code: 1,
signal: null,
cmd: '/bin/sh -c /etc/init.d/myservice start' }

On CentOS7 the systemd.js code to start and stop the service with child_process.exec() works fine.

Has anyone else seen an issue like this or have any ideas?
Thanks,
Scott

/bin/sh: 1: /etc/init.d/servicename: not found, /bin/bash^M: bad interpreter: No such file or directory

Using systemv

var Service = require('node-linux').Service;
// Create a new service object
var svc = new Service({
  name: 'servicename',
  description: 'Serveur servicename',
  author: 'William Desportes',
  mode: 'systemv',
  script: __dirname + '/server.js',
  env: {
    name: 'NODE_ENV',
    value: 'production',
  },
});

svc.on('install', function() {
  svc.start();
});
svc.on('start', function() {
  console.log('Démarrage du service');
});
svc.on('stop', function() {
  console.log('Arrêt du service');
});
svc.on('doesnotexist', function() {
  svc.install();
});
svc.on('uninstall', function() {
  svc.install();
});
svc.uninstall();

Why

Error

root@dev:/# /etc/init.d/servicename
bash: /etc/init.d/servicename: /bin/bash^M: bad interpreter: No such file or directory

The file seems to have windows format
Using dos2unix /etc/init.d/servicename solved the install and made the service file work fine.

AWS AMI support

Hi,

I am using node-linux in one of my projects recently which runs on Amazon AWS. I've added support for AWS AMI and also added support for '-' and '_' in the service name. Please let me know if you are interested in taking them.

Thanks

Fix how Linux flavor is determined for generating systemv init script

In lib/systemv.js, the output of "cat /proc/version" is parsed for certain Redhat or Debian strings. This does not work for all Linux builds.

The standard method for init scripts is to check for either of the "/etc/redhat-release" or "/etc/debian-version" files, since they only exist in their respective Linux flavors.

Hopefully this is easy to fix, since your service does not work with our current Redhat or Debian Linux builds (although Debian is the default flavor so it ends up generating the right script for it).

Spurious dependency of the "system" command

In lib/systemv.js:272 your call "service $(this.label) start" to start a service', but that's not the standard SystemV way of starting scripts, I think it's only a shortcut available in Debian and Ubuntu.

A more portable/standard way would be:

    var cmd = '/etc/init.d/'+this.label+' start';
    console.log(cmd);
    exec(cmd,function(err){ ...

If you agree I'll submit a pull request

service label without number ?

Hi,

I noticed that service with numbers in their name are filtered. For example my program called "pv5web" becomes "pvweb".

Is there a particular reason? or is it a bug?

26th April, 2023: Typescript support

Is your feature request related to a problem? Please describe.
Yes, it is related to a little problem

Describe the solution you'd like
I love and appreciate the effort put into this library by you wonderful people, but i'm facing some kind of issue, i can't seem to get the types definition for this library via npm i -D @types/node-linux. I would like to be directed to the appropriate library to get the types definition for both the node-linux and node-mac libraries.

Describe alternatives you've considered
I've gone to npmjs to search for the @types/node-linux and the @types/node-mac libraries, but i can only find the types definition for node-windows

Please use the reactions to cast a vote in favor of or against this feature suggestion »

Console.log redirection

Console.log redirection not working for me at all. Tested with systemv & systemd on different Debian instances.
Node v.0.12

wrapper.js crashes when /var/log runs out of space

My program crashed when launched from a /etc/init.d/ script created by node-linux

This is the error, from /var/log/parkberry-error.log:

Wed Apr 01 2015 15:44:17 GMT+0200 (CEST) - SVCMGR - Uncaught exception: Error: ENOSPC, no space left on device
    at Object.fs.writeSync (fs.js:540:18)
    at Object.fs.writeFileSync (fs.js:987:21)
    at Object.fs.appendFileSync (fs.js:1024:6)
    at Socket.<anonymous> (/home/pi/node_modules/package/node_modules/node-linux/lib/wrapper.js:155:8)
    at Socket.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:765:14)
    at Socket.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:427:10)
    at emitReadable (_stream_readable.js:423:5)
    at readableAddChunk (_stream_readable.js:166:9)

Indeed, /var/log is full, and my program is to blame, but if node-linux is in charge of creating the log, it should be in charge or splitting/rotating it

pi@0000000023593fb2 /var/log $ df -h
Filesystem      Size  Used Avail Use% Mounted on
(...)
tmpfs           100M  100M     0 100% /var/log
(...)

pi@0000000023593fb2 /var/log $ du -sh parkberry.log 
100M    parkberry.log

Amazon Linux

Hi,

First: Thanks a lot to create this module! It's really very useful.

I was trying use in Amazon Linux and I get the problem in systemv.js
cat /proc/version get a undefined _os. Parse it's a little different.

This is the answer in Amazon Linux:
cat /proc/version
Linux version 4.1.17-22.30.amzn1.x86_64 (mockbuild@gobi-build-60009) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Fri Feb 5 23:44:22 UTC 2016

You can use Amazon Linux like a RedHat!

suse support

Is suse supported or planned to be supported or even possible to support?

Installing on Raspbian jessie

Hi,

i have received an error starting a service on rasbian jessie:

install
Install!
(node) Buffer.write(string, encoding, offset, length) is deprecated. Use write(string[, offset[, length]][, encoding]) instead.
service monitorpi start
/opt/monitor/node_modules/node-linux/lib/systemv.js:273
          if (err) throw err;
                   ^

Error: Command failed: /bin/sh -c service monitorpi start
Failed to start monitorpi.service: Unit monitorpi.service failed to load: No such file or directory.

    at ChildProcess.exithandler (child_process.js:203:12)
    at emitTwo (events.js:87:13)
    at ChildProcess.emit (events.js:172:7)
    at maybeClose (internal/child_process.js:818:16)
    at Socket.<anonymous> (internal/child_process.js:319:11)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at Pipe._onclose (net.js:469:12)

My code for installing is:

var Service = require('node-linux').Service;
var args = process.argv.slice(2);
var svc = new Service({
    name: 'MonitorPI',
    description: 'MonitorPI Server',
    script: require('path').join(__dirname, 'app.js'),
    wait: 2,
    grow: .5,
    maxRestarts: 5,
    env: {
        name: "NODE_ENV",
        value: "production"
    }
});
console.log(args[0]);
if (args.length >= 1) {
    if (args[0] == 'install') {
        svc.on('install', function () {
            svc.start();
        });
        svc.install();
        console.log("Install!");
    } else if (args[0] == 'uninstall') {
        svc.on('uninstall', function () {
            console.log('Uninstall complete.');
            console.log('The service exists: ', svc.exists);
        });
        // Uninstall the service.
        svc.uninstall();
        console.log("Uninstall!");
    }
}

I have tried to move script from /etc/init.d/ to /lib/systemd/system and renamed it to have .service at the end.

then i received:

Failed to start monitorpi.service: Unit monitorpi.service failed to load: Bad message. See system logs and 'systemctl status monitorpi.service' for details.

Systemd log:

Nov 20 10:22:44 raspberrypi systemd[1]: Configuration file /lib/systemd/system/monitorpi.service is marked executable. Please remove executable permission bits. Proceeding anyway.
Nov 20 10:22:44 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:43] Missing '='.
Nov 20 10:22:45 raspberrypi systemd[1]: Configuration file /lib/systemd/system/monitorpi.service is marked executable. Please remove executable permission bits. Proceeding anyway.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:19] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:21] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:24] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:26] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:29] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:32] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:34] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:35] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:36] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:43] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:44] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:45] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:47] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:48] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:49] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:52] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:53] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:54] Assignment outside of section. Ignoring.
Nov 20 10:22:45 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:56] Invalid section header '[ $UID -eq "0" ] && LOCAL_VAR_RUN=/var/run # in case this script is run by root, override user setting'
Nov 20 10:22:55 raspberrypi systemd[1]: Configuration file /lib/systemd/system/monitorpi.service is marked executable. Please remove executable permission bits. Proceeding anyway.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:19] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:21] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:24] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:26] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:29] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:32] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:34] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:35] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:36] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:43] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:44] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:45] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:47] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:48] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:52] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:53] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:54] Assignment outside of section. Ignoring.
Nov 20 10:22:55 raspberrypi systemd[1]: [/lib/systemd/system/monitorpi.service:56] Invalid section header '[ $UID -eq "0" ] && LOCAL_VAR_RUN=/var/run # in case this script is run by root, override user setting'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.