spawn.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. const { cwd, errno, strerror, spawn } = just.sys
  2. const path = cwd()
  3. const [...args] = just.args.slice(2)
  4. const { socketpair, AF_UNIX, SOCK_STREAM } = just.net
  5. function createPipe () {
  6. const fds = []
  7. const r = socketpair(AF_UNIX, SOCK_STREAM, fds)
  8. if (r !== 0) throw new Error(`socketpair ${r} errno ${errno()} : ${strerror(errno())}`)
  9. return fds
  10. }
  11. const cpus = parseInt(just.env().CPUS || just.sys.cpus, 10)
  12. const pids = []
  13. for (let i = 0; i < cpus; i++) {
  14. const stdin = createPipe()
  15. const stdout = createPipe()
  16. const stderr = createPipe()
  17. const pid = spawn('just', path, args, stdin[1], stdout[1], stderr[1])
  18. pids.push(pid)
  19. }
  20. const { readStat } = require('lib/monitor.js')
  21. const last = { user: 0, system: 0 }
  22. just.setInterval(() => {
  23. const stat = { user: 0, system: 0, rss: 0 }
  24. for (const pid of pids) {
  25. const { utime, stime, rssPages } = readStat(pid)
  26. const rss = Math.floor((rssPages * just.sys.pageSize) / (1024 * 1024))
  27. stat.rss += rss
  28. stat.user += utime
  29. stat.system += stime
  30. }
  31. const user = stat.user - last.user
  32. const system = stat.system - last.system
  33. last.user = stat.user
  34. last.system = stat.system
  35. just.print(`children ${pids.length} rss ${stat.rss} user ${user} system ${system} total ${user + system}`)
  36. }, 1000)