"Remi L." <r...@sysdev.re> wrote: > Hello everyone, > > I am an OpenBSD user and I recently installed Node.js. I managed to > create an rc.d script to start a basic Node.js application, but it only > starts manually. > > At OpenBSD boot, I can see that the application is started, but it > doesn't work. I have the impression that it is related to the > node_modules directory, because after inspection, the JavaScript file > seems to stop at the line : > > const express = require("express"); > > It cannot load the express module. > > Here are the full details so that you can reproduce the same error on > your side: > > OpenBSD version: 7.3 (release + syspatch) > > Node version: 18.15.0 > > npm version: 9.5.0 > > Let's create a basic node.js app: > > mkdir /var/www/htdocs/app > cd /var/www/htdocs/app/ > npm init -y > npm install express > touch server.js > chown -R www.www /var/www/htdocs/app > chmod -R 775 /var/www/htdocs/app > > /var/www/htdocs/app/server.js file: > > --8<-- > const express = require("express"); > > const app = express(); > > app.get("/", (req, res) => { > res.send("Hello from OpenBSD"); > }); > > app.listen(80, () => { > console.log("Server started on port 80"); > }); > > --EOF-- > > You can run `node server.js` to test the url: http://your-ip > > Ctrl-c to quit > > Now let's create the /etc/rc.d/app script: > > --8<-- > #!/bin/ksh > > daemon="/usr/local/bin/node" > daemon_execdir="/var/www/htdocs/app" > daemon_flags="server.js" > daemon_logger="daemon.info"
After checking rc_exec() in /etc/rc.d/rc.subr, a hack you can try to get more information is removing the daemon_logger variable and change daemon_flags to daemon_flags="server.js >/tmp/server.js.log 2>&1 That should create a /tmp/server.js.log file with the program's stdout and stderr. Give it a try with rcctl start / stop, and if it works, go with a reboot. > #daemon_rtable=0 > #daemon_timeout=30 > #daemon_user=root > > . /etc/rc.d/rc.subr > > #pexp="$(eval echo ${daemon}${daemon_flags:+ ${daemon_flags}})" > rc_bg="YES" > rc_reload="NO" > #rc_reload_signal=HUP > #rc_stop_signal=TERM > #rc_usercheck= # (undefined or "NO") > > #rc_configtest() { > #} > > #rc_pre() { > #} > > #rc_start() { > # rc_exec "${daemon} ${daemon_flags}" > #} > > #rc_check() { > # pgrep -T "${daemon_rtable}" -q -xf "${pexp}" > #} > > #rc_reload() { > # pkill -${rc_reload_signal} -T "${daemon_rtable}" -xf "${pexp}" > #} > > #rc_stop() { > # pkill -${rc_stop_signal} -T "${daemon_rtable}" -xf "${pexp}" > #} > > #rc_post() { > #} > > rc_cmd $1 > --EOF-- > > chmod +x /etc/rc.d/app > rcctl enable app > > Start the app: rcctl start app > > Check in the browser or use: netstat -anf inet | grep 80 > > Stop the app: rcctl stop app > > Check that it is not anymore started: pgrep node => nothing > > - Reboot - > > If I do a `dmesg -s`, I can see the following line: > > starting package daemons: app. > > No errors, no output, even in the /var/log/daemon log. > > I would be very grateful for any help or advice that you can provide. > > > > Sincerely, > > -- Remi > > "Everyone makes mistakes, and the best way to learn is from our > mistakes." - Henry Ford