breejs / bree

Bree is a Node.js and JavaScript job task scheduler with worker threads, cron, Date, and human syntax. Built for @ladjs, @forwardemail, @spamscanner, @cabinjs.
https://jobscheduler.net
MIT License
2.96k stars 80 forks source link

Segmentation Fault on arm64 #193

Closed BjoernRave closed 1 year ago

BjoernRave commented 1 year ago

I am trying to run bree on my raspberry with the 64-bit version of raspberry-pi os.

However after one job finishes I get a "segementation fault" error.

With the help of segfault-handler I was able to get this error log:

PID 3379 received SIGSEGV for address: 0x7f901c93b8
/home/flut/control/node_modules/segfault-handler/build/Release/segfault-handler.node(+0x2a84)[0x7f901cca84]
linux-vdso.so.1(__kernel_rt_sigreturn+0x0)[0x7f917d9788]
node[0x14c70a4]
node[0x14d84e8]
node(uv_run+0x130)[0x14c7ab0]
node(_ZN4node13SpinEventLoopEPNS_11EnvironmentE+0x124)[0xa49074]
node(_ZN4node16NodeMainInstance3RunEPKNS_16EnvSerializeInfoE+0x168)[0xb37500]
node(_ZN4node5StartEiPPc+0x1e8)[0xac5180]
/lib/aarch64-linux-gnu/libc.so.6(__libc_start_main+0xe8)[0x7f9136b218]
node[0xa473dc]
Segmentation fault
shadowgate15 commented 1 year ago

We are going to need more information about your setup, code, etc. in order to help.

BjoernRave commented 1 year ago
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.15.32-v8+
      Architecture: arm64

I am running this file:

index.ts

import Graceful from '@ladjs/graceful'
import Bree from 'bree'
import * as path from 'node:path'

const SegfaultHandler = require('segfault-handler')
SegfaultHandler.registerHandler('crash.log')

Bree.extend(require('@breejs/ts-worker'))

const standardInterval = 'every 40 seconds'

const bree = new Bree({

  /**
   * Always set the root option when doing any type of
   * compiling with bree. This just makes it clearer where
   * bree should resolve the jobs folder from. By default it
   * resolves to the jobs folder relative to where the program
   * is executed.
   */
  root: path.join(__dirname, 'jobs'),
  /**
   * We only need the default extension to be "ts"
   * when we are running the app with ts-node - otherwise
   * the compiled-to-js code still needs to use JS
   */
  defaultExtension: 'ts',
  jobs: [
    // {
    //   name: 'temperature',
    //   interval: standardInterval,
    // },
    // {
    //   name: 'pi-stats',
    //   interval: standardInterval,
    // },
    {
      name: 'fans',
      interval: standardInterval,
    },
  ],
})

const graceful = new Graceful({ brees: [bree] })
graceful.listen()
;(async () => {
  await bree.start()
  console.log('Bree started')
})()

and this job:

jobs/fans.ts

import GPIOFlat from 'rpi-gpio'
import { sleep } from '../../utils'

const GPIO = GPIOFlat.promise

const relais1 = 7

;(async () => {
  try {
    await GPIO.setup(relais1, GPIO.DIR_OUT)

    await GPIO.write(relais1, true)

    await sleep(5)

    await GPIO.write(relais1, false)

    await GPIO.destroy()
  } catch (error) {
    console.log('error', error)
  }
})()

with ts-node index.ts

Edit: I just commented out everything rpi-gpio related and the error disappears, so it's somewhat related to that. If I run the jobs/fans.ts file on its own it works fine though

shadowgate15 commented 1 year ago

the segmentation fault would make me think that it is running out of memory. I don't know if the rpi-gpio bundle is too large for the system or if there is something else causing the memory to run out.

shadowgate15 commented 1 year ago

I have seen the segmentation fault when compiling a typescript project in a docker container that has too little RAM before.

titanism commented 1 year ago

This is not a problem with Bree. It would be a problem with Node.js worker threads, CPU or memory limitations, or some other dependency. Please check https://github.com/nodejs/node for similar issues.