npm-run-all icon indicating copy to clipboard operation
npm-run-all copied to clipboard

Error when executing scripts with pipes in parallel

Open ybc37 opened this issue 8 years ago • 2 comments

I'm using npm-run-all for scripts that build SCSS and JS (transpiling, bundling, compressing, ...). This works quite well, but when I try to execute these scripts in parallel, I occasionally run into errors.

I stripped it down and put it in a repository: https://github.com/nesmyslny/npm-script-issue

These are the scripts in package.json:

// [...]
  "scripts": {
    "build-p": "npm-run-all -pnl build:**",
    "build-s": "npm-run-all -snl build:**",
    "build:css": "node-sass in.scss | postcss --use autoprefixer -o out.css",
    "build:js": "browserify in.js -o out.js -t [ babelify --presets [ latest ] ]",
    "build:min:css": "node-sass in.scss --output-style compressed | postcss --use autoprefixer -o out.min.css",
    "build:min:js": "browserify in.js -t [ babelify --presets [ latest ] ] | uglifyjs -c > out.min.js"
  }
// [...]

Executing them sequentially works (npm run build-s). But in parallel (npm run build-p) I get, for example, that output:

[build:css    ] 
[build:css    ] > @ build:css /home/user/tmp/npm-script-issue/package.json
[build:css    ] > node-sass in.scss | postcss --use autoprefixer -o out.css 
[build:css    ] 
[build:js     ] 
[build:js     ] > @ build:js /home/user/tmp/npm-script-issue/package.json
[build:js     ] > browserify in.js -o out.js -t [ babelify --presets [ latest ] ] 
[build:js     ] 
[build:min:css] 
[build:min:css] > @ build:min:css /home/user/tmp/npm-script-issue/package.json
[build:min:css] > node-sass in.scss --output-style compressed | postcss --use autoprefixer -o out.min.css 
[build:min:css] 
[build:min:js ] 
[build:min:js ] > @ build:min:js /home/user/tmp/npm-script-issue/package.json
[build:min:js ] > browserify in.js -t [ babelify --presets [ latest ] ] | uglifyjs -c > out.min.js 
[build:min:js ] 
[build:js     ] 
[build:js     ] > @ build:js /home/user/tmp/npm-script-issue
[build:js     ] > browserify in.js -o out.js -t [ babelify --presets [ latest ] ]
[build:js     ] 
[build:css    ] 
[build:css    ] > @ build:css /home/user/tmp/npm-script-issue
[build:css    ] > node-sass in.scss | postcss --use autoprefixer -o out.css
[build:css    ] 
[build:min:css] 
[build:min:css] > @ build:min:css /home/user/tmp/npm-script-issue
[build:min:css] > node-sass in.scss --output-style compressed | postcss --use autoprefixer -o out.min.css
[build:min:css] 
[build:min:js ] 
[build:min:js ] > @ build:min:js /home/user/tmp/npm-script-issue
[build:min:js ] > browserify in.js -t [ babelify --presets [ latest ] ] | uglifyjs -c > out.min.js
[build:min:js ] 
[build:css    ] events.js:182
[build:css    ]       throw er; // Unhandled 'error' event
[build:css    ]       ^
[build:css    ] 
[build:css    ] Error: EAGAIN: resource temporarily unavailable, write
[build:css    ] ✖ Processing stdin
[build:css    ] 
[build:css    ] 
[build:css    ] ✖ Syntax Error: stdin
[build:css    ] 
[build:css    ]  [2952:3] Unclosed block
[build:css    ] 
[build:css    ]    2950 |     background-color: #31b0d5;
[build:css    ]   2951 |     border-color: #269abc; }
[build:css    ] > 2952 |   .btn-info:active, .btn-info.active,
[build:css    ]        |   ^
[build:css    ]   2953 |   .open > .btn-info.dropdown-toggle {
[build:css    ]   2954 |     color: #fff; 
[build:css    ] 
[build:css    ] 
[build:css    ] npm ERR! code ELIFECYCLE
[build:css    ] npm ERR! errno 1
[build:css    ] npm ERR! @ build:css: `node-sass in.scss | postcss --use autoprefixer -o out.css`
[build:css    ] npm ERR! Exit status 1
[build:css    ] npm ERR! 
[build:css    ] npm ERR! Failed at the @ build:css script.
[build:css    ] npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
[build:css    ] 
[build:css    ] npm ERR! A complete log of this run can be found in:
[build:css    ] npm ERR!     /home/user/.npm/_logs/2017-06-12T18_48_34_075Z-debug.log
ERROR: "build:css" exited with 1.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @ build-p: `npm-run-all -pnl build:**`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the @ build-p script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2017-06-12T18_48_34_200Z-debug.log

Sometimes it works, so maybe it's even related to the performance of the machine, etc. It doesn't make a different if I use npm or yarn; same behavior.

Can piping and/or redirection be a problem, when executing in parallel? Did I miss a limitation?

I would be grateful of for any hint :smiley:

ybc37 avatar Jun 12 '17 19:06 ybc37

I apology that I have overlooked the notification of this issue.

Thank you for the report. Interesting. I have not been aware of the limitation about this issue. The error message "Error: EAGAIN: resource temporarily unavailable, write\n✖ Processing stdin" indicates there is the problem around the piping in the script`. I need to investigate more.

mysticatea avatar Jul 23 '17 06:07 mysticatea

I'm getting this as well but I'm not using npm-run-all, I think the issue might lie with node-sass but I'm not sure what exactly is throwing the error.

Edit: Oh actually, maybe not according to this comment https://github.com/sass/node-sass/issues/2075#issuecomment-324344654

leggsimon avatar Aug 25 '17 14:08 leggsimon