Nodemon: خطأ: استمع EADDRINUSE

تم إنشاؤها على ١٦ أبريل ٢٠١٨  ·  44تعليقات  ·  مصدر: remy/nodemon

  • nodemon -v : 1.17.3
  • node -v : 8.10.0
  • نظام التشغيل / بيئة المحطة: MacOS 10.13.4
  • الأمر الذي قمت بتشغيله: nodemon app.js

سلوك متوقع

يجب إعادة تشغيل التطبيق عندما تكون هناك تغييرات باستخدام نفس خادم http (المضيف والخادم)

السلوك الفعلي

يعيد تشغيل التطبيق ولكن مع ظهور خطأ يقول EADDRINUSE.

خطوات التكاثر

  1. أنشئ تطبيق ExpressJS صغيرًا. ملفان على الأقل: app.js و dummy.js
  2. دع app.js يتطلب dummy.js
  3. استمع إلى مضيف (أي 127.0.0.1) ومنفذ (أي 4000)
  4. تشغيل nodemon app.js
  5. تحرير وحفظ dummy.js
can't replicate

التعليق الأكثر فائدة

حل لموظفي Google ...

بالنسبة لي ، تحدث المشكلة بسبب استخدام concurrently (وهو بحد ذاته حل بديل للمشكلة التي لا يفهمها nodemon أنني بحاجة إلى أكثر من عملية واحدة قيد التشغيل). إذا لم أكن مخطئًا ، فسيتم إغلاقها بشكل متزامن ويعتبر nodemon أن المهمة قد أنجزت.

حتى مع عدم استخدام المتزامن ، واجهت الكثير من المشكلات المماثلة في الماضي بسبب تعارضات الخروج من nodemon والخروج من العملية.

يمكنك عمليًا حل جميع المشكلات غير المنطقية المتعلقة بالمنافذ مثل هذا:

"events": {
    "restart": "fuser -k 5000/tcp ; fuser -k 3050/tcp"
}

يقول ما سبق بشكل أساسي "اقتل أي شيء يعمل على منفذي TCP 5000 و 3050"

قد ترغب أيضًا في إضافة هذا في نص قبل بدء nodemon:

# replace with your own ports
fuser -k 5000/tcp 
fuser -k 3050/tcp

تحتاج أيضًا إلى إضافة هذا أيضًا إلى أمر nodemon:

 --delay 1500ms

إذا لم يكن هناك تأخير ، فستحصل على بعض تعارض المنافذ مرتين من أصل 10.

يمنع التأخير أيضًا nodemon من إعادة تشغيل البريد العشوائي لأنه يعيد تعيين كل تغيير جديد (يمنع أي شيء آخر يسبب التعارض).

سيكون من الأجمل أن يكون قتل المنافذ قبل إعادة التشغيل مجرد شيء تم إنشاؤه (إلى جانب القدرة على تنفيذ نصوص متعددة في وقت واحد).

ccremy

ال 44 كومينتر

لا يمكن التكرار:

1316

// app.js
require('./dummy.js');
require('express')().listen(3000);

بنية الدليل (sans node_modules) - لاحظ أيضًا أنه لا يوجد nodemon.json عالمي قيد التشغيل:

❯ tre
      1 .
      2 ├── app.js
      3 ├── dummy.js
      4 ├── package-lock.json
      5 └── package.json
      6
      7 0 directories, 4 files

تفريغ التكوين:

--------------
node: v8.9.1
nodemon: master: aa18c806b37715a5b13aa7660e098f1fe7319a1c (1 dirty files)
command: /Users/remy/.nvm/versions/node/v8.9.1/bin/node /Users/remy/.nvm/versions/node/v8.9.1/bin/nodemon --dump
cwd: /Users/remy/Sites/nodemon/issues/1316
OS: darwin x64
--------------
{ run: false,
  system: { cwd: '/Users/remy/Sites/nodemon/issues/1316' },
  required: false,
  dirs: [ '/Users/remy/Sites/nodemon/issues/1316' ],
  timeout: 1000,
  options:
   { dump: true,
     ignore:
      [ '**/.git/**',
        '**/.nyc_output/**',
        '**/.sass-cache/**',
        '**/bower_components/**',
        '**/coverage/**',
        '**/node_modules/**',
        re: /.*.*\/\.git\/.*.*|.*.*\/\.nyc_output\/.*.*|.*.*\/\.sass\-cache\/.*.*|.*.*\/bower_components\/.*.*|.*.*\/coverage\/.*.*|.*.*\/node_modules\/.*.*/ ],
     watch: [ '*.*', re: /.*\..*/ ],
     ignoreRoot:
      [ '**/.git/**',
        '**/.nyc_output/**',
        '**/.sass-cache/**',
        '**/bower_components/**',
        '**/coverage/**',
        '**/node_modules/**' ],
     restartable: 'rs',
     colours: true,
     execMap: { py: 'python', rb: 'ruby' },
     stdin: true,
     runOnChangeOnly: false,
     verbose: false,
     signal: 'SIGUSR2',
     stdout: true,
     watchOptions: {},
     execOptions:
      { script: 'index.js',
        exec: 'node',
        args: [],
        scriptPosition: 0,
        nodeArgs: undefined,
        execArgs: [],
        ext: 'js,mjs,json',
        env: {} },
     monitor:
      [ '*.*',
        '!**/.git/**',
        '!**/.nyc_output/**',
        '!**/.sass-cache/**',
        '!**/bower_components/**',
        '!**/coverage/**',
        '!**/node_modules/**' ] },
  load: [Function],
  reset: [Function: reset],
  lastStarted: 0,
  loaded: [],
  watchInterval: null,
  signal: 'SIGUSR2',
  command:
   { raw: { executable: 'node', args: [ 'index.js' ] },
     string: 'node index.js' } }
--------------

سأترك هذه المشكلة مفتوحة لك لتصحيحها والعثور على الإجابة (على افتراض أنها لا تصبح قديمة).

واجهت هذه المشكلة من قبل. لقد حدث ذلك بالصدفة.
IMO ، يرجع هذا النوع من المشكلات إلى إعادة تشغيل nodemon للخادم قبل تحرير المنفذ المستخدم.

هل نختار القضايا القابلة للتكرار بدلاً من الآراء؟ سيساعد ذلك في إصلاح الخطأ ...

إذا كان هناك أي شيء يمكنه تكرار هذا باستمرار (حتى بطريقة مفتعلة) ، فلنقم بذلك ، وإلا فسيتم إغلاق هذه المشكلة في غضون أسبوع تقريبًا.

تم ذكر هذا مرة أخرى مؤخرًا في قضية مغلقة. https://github.com/remy/nodemon/issues/1025#issuecomment -381025138.

سأحاول إنشاء اختبار آخر وآمل أن أتمكن من تحديد السبب.

لدي نفس المشكلة على Ubuntu 16.04 nodemon 1.17.3 مع تشغيل nodemon --watch src/theme.json --watch webpack.config.js --exec webpack-dev-server --port=4200 . عند النقر فوق CTRL + C ، يتم قتل nodemon لكن webpack-dev-server ليس كذلك. عند تشغيل webpack-dev-server بمفرده ، لا أواجه مثل هذه المشكلة.

preslavsh هل يمكن أن تعطيني الريبو

لا يمكنني مشاركة الريبو ، لكن يمكنني العمل على المشكلة لاحقًا أو إعادة إنتاجها في مشروع آخر. شكرا لك.

أيضا تواجه هذه المشكلة. لسوء الحظ ، لا يمكنني مشاركة المستودع ولكنني أرغب في قضاء بعض الوقت لاحقًا لاختبار مثالك ومحاولة إعادة إنتاج مثال في مستودع صغير.

[nodemon] 1.17.3
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `ts-node ./bin/www`
Starting server from bin/www
Server started at http://localhost:8080
[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] starting `ts-node ./bin/www`
Starting server from bin/www
Error: listen EADDRINUSE :::8080
    at Object._errnoException (util.js:1022:11)
    at _exceptionWithHostPort (util.js:1044:20)
    at Server.setupListenHandle [as _listen2] (net.js:1367:14)
    at listenInCluster (net.js:1408:12)
    at Server.listen (net.js:1492:7)
    at Object.<anonymous> (/home/-----/bin/www:12:28)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at Object.<anonymous> (/home/-----/node_modules/ts-node/src/bin.ts:145:12)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
[nodemon] app crashed - waiting for file changes before starting...

العقدة: 8.11.1
Nodemon: 1.17.3
نظام التشغيل: دبيان 9

تحرير: تمت محاولة التكرار باستخدام الرمز الوهمي أعلاه ولم يتمكن من التكرار. سأقوم ببعض الاختبارات الإضافية مع مستودعي الخاص.

تستمر عملية
فيما يلي رموز لتكرار هذه الحالة.

OPedsamonte وآخرون ، مهم:

ما الذي تستخدمه لتشغيل التطبيق الخاص بك؟

  1. غزل
  2. npm
  3. لا (عقدة مباشرة أو nodemon مباشرة)

@ jasonxia23 أخشى أن هذا اختبار غير صالح. أنت ترسل إشارة SIGKILL ( -9 ) إلى عملية العقدة الجذرية (nodemon) لذلك ليس لديها القدرة على تنظيف العملية الفرعية.

إذا نفدت الذاكرة وقتل مستوى نظام التشغيل ، إذن نعم ، ستسوء الأمور. لكن هذه المشكلة الأصلية المقدمة لا تتعلق بذلك ، فهي تستند إلى إعادة تشغيل قائمة على رمز وما زالت العملية التابعة قيد التشغيل في الخلفية (آسف ، ستحتاج إلى المحاولة مرة أخرى).

حتى الآن لا توجد اتجاهات حول كيفية تكرار هذا الخطأ.

لدي نفس المشكلة.
هذه هي المحطة الطرفية الخاصة بي منذ اللحظة التي أقوم فيها بتشغيل الخادم.

➜  dev-connector git:(models-and-authentication) ✗ npm run server

> [email protected] server /home/logan/dev/dev-connector
> nodemon server.js

[nodemon] 1.17.3
[nodemon] to restart at any time, enter 'rs'
[nodemon] watching: *.*
[nodemon] starting 'node server.js'
Server running on port 5000
MongoDB Connected
//SAVING NEW FILE OCCURS HERE.
[nodemon] restarting due to changes...
[nodemon] starting node server.js
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::5000
    at Object._errnoException (util.js:1022:11)
    at _exceptionWithHostPort (util.js:1044:20)
    at Server.setupListenHandle [as _listen2] (net.js:1367:14)
    at listenInCluster (net.js:1408:12)
    at Server.listen (net.js:1492:7)
    at Function.listen (/home/logan/dev/dev-connector/node_modules/express/lib/application.js:618:24)
    at Object.<anonymous> (/home/logan/dev/dev-connector/server.js:33:5)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3
[nodemon] app crashed - waiting for file changes before starting...

لا أعرف ما إذا كان بإمكاني المساعدة في أي شيء بخلاف ما قاله الملصق الأصلي.
نظام التشغيل: Ubuntu 16.04

تواجه هذا أيضًا مع nodemon 1.17.3 ، العقدة 8.11

الرجاء إعادة الاختبار باستخدام nodemon --signal SIGTERM والإبلاغ عما إذا كنت قادرًا على تكرار المشكلة أم لا.

لم يكن لدي أي شيء يسمح لي بتكرار هذه المشكلة (وأظن بشدة أنها مزيج من المشكلات استنادًا إلى كود المؤلف ، و env ، والتكوين ، وما إلى ذلك). سأضطر إلى إغلاق هذه المشكلة - إلا إذا كان شخص ما قادرًا على محاولة تصحيح الأخطاء بنفسه.

لم أتمكن من تكرارها منذ أن واجهت الخطأ. عندما واجهت الخطأ مرة أخرى (مرة واحدة فقط) ، استخدمت الأمر killall node ولم يظهر لي الخطأ منذ ذلك الحين. قد يكون الأمر أن نظام التشغيل لا يقتل العملية قبل إعادة تشغيل الخادم. لكن يمكنني التكهن فقط. أنا آسف لأنني لم أحصل على الكثير من المساعدة ، فأنا ما زلت جديدًا نسبيًا على عالم التطوير وأحاول تقديم أكبر قدر ممكن من المساعدة.

تحرير: إذا واجهت الخطأ ، فسأعيد الاختبار على الفور باستخدام nodemon --signal SIGTERM .

تضمين التغريدة كانت تواجه نفس المشكلة ولكن killall node أصلحها.

حل لموظفي Google ...

بالنسبة لي ، تحدث المشكلة بسبب استخدام concurrently (وهو بحد ذاته حل بديل للمشكلة التي لا يفهمها nodemon أنني بحاجة إلى أكثر من عملية واحدة قيد التشغيل). إذا لم أكن مخطئًا ، فسيتم إغلاقها بشكل متزامن ويعتبر nodemon أن المهمة قد أنجزت.

حتى مع عدم استخدام المتزامن ، واجهت الكثير من المشكلات المماثلة في الماضي بسبب تعارضات الخروج من nodemon والخروج من العملية.

يمكنك عمليًا حل جميع المشكلات غير المنطقية المتعلقة بالمنافذ مثل هذا:

"events": {
    "restart": "fuser -k 5000/tcp ; fuser -k 3050/tcp"
}

يقول ما سبق بشكل أساسي "اقتل أي شيء يعمل على منفذي TCP 5000 و 3050"

قد ترغب أيضًا في إضافة هذا في نص قبل بدء nodemon:

# replace with your own ports
fuser -k 5000/tcp 
fuser -k 3050/tcp

تحتاج أيضًا إلى إضافة هذا أيضًا إلى أمر nodemon:

 --delay 1500ms

إذا لم يكن هناك تأخير ، فستحصل على بعض تعارض المنافذ مرتين من أصل 10.

يمنع التأخير أيضًا nodemon من إعادة تشغيل البريد العشوائي لأنه يعيد تعيين كل تغيير جديد (يمنع أي شيء آخر يسبب التعارض).

سيكون من الأجمل أن يكون قتل المنافذ قبل إعادة التشغيل مجرد شيء تم إنشاؤه (إلى جانب القدرة على تنفيذ نصوص متعددة في وقت واحد).

ccremy

srcspider شكرا لك على هذا. أعلم أن OP لم يكن يستخدم بشكل متزامن ، لكنني أعلم أن ذلك يتسبب في نفس الوقت في بعض المشكلات في مشكلات أخرى.

هل تمانع في فتح العلاقات العامة لإضافة هذا إلى الأسئلة الشائعة؟ إنها نصيحة مفيدة للآخرين. شكرا لك مرة أخرى.

سأغلق هذه المشكلة في الساعات القليلة القادمة حتى يتمكن أي شخص من تقديم أي محاولة لتكرار هذه المشكلة. أخشى أنه بقدر ما واجه الناس المشكلة ، لم يكن لدي ما يكفي لمواصلة تكرارها.

أقدر أيضًا أن هناك العشرات من الطرق التي يمكن أن يحدث بها ذلك (رفض العملية الفرعية إغلاق الاتصالات والاستمرار في العمل) ، ولكن حتى في الاختبارات المفتعلة - لا يمكنني التكرار (ربما لأنني لا أعرف المنافذ جيدًا بما يكفي).

آمل حقًا أن أحصل على بعض الجاذبية بشأن هذه المشكلة (ولست مشرفًا قذرًا!).

يسعد أي شخص أن ينشئ عددًا جديدًا مع هذا الموضوع طالما أن هناك شيئًا لاختباره.

شكرا لكم جميعا.

آسف لطرح قضية مغلقة. لقد حدث هذا بشكل متزامن ولم أشعر أنه كان مشكلة جديدة جديرة منذ أن ذكر srcspider إصلاحًا أعلاه. مجرد فضول حول كيفية إعداد ذلك بشكل صحيح .. هل هو موجود في package.json لخادمي؟ أو داخل وحدة nodemon في مكان ما؟

ccremy نظرًا لأنك توافق على الحل البديل

كنت أواجه نفس الخطأ ، بعد حفظ التغيير ، كان nodemon يعيد تحميل البنية ويتعطل بسبب مشكلة EADDRINUSE.

كنت أستخدم 1.14.1 وأقوم بالتحديث إلى * 1.18.3 * الخطأ ، والآن أعمل بسلاسة.

الآن بعد أن ذكرت ذلك ، لا أعتقد أنني رأيت الخطأ منذ فترة طويلة.

واجهت نفس المشكلة التي أصلحتها بإضافة --signal SIGTERM

يعمل إلحاق --delay 1500ms لي في منع العنوان قيد الاستخدام. شكرا @ srcspider

بلدي الحل:

nodemon.json

{
  "execMap": {
    "js": "babel-node"
  },
  "env": {
    "NODE_ENV": "development"
  },
  "ext": ".js,.jsx",
  "ignore": [
    "test",
    "dist",
    "docs",
    "logs"
  ],
  "events": {
    "start": "sh nodemon.sh"
  },
  "script": "./src/server.js",
  "restartable": "rs",
  "verbose": false,
  "watch": ["src"],
  "stdin": false,
  "stdout": true,
  "quiet": true,
  "colours": true
}

nodemon.sh

PID=$(ps aux | grep _babel-node | sed -n '2p' | awk '{print $2}');

if [ ! -z "$PID" ]; then
  { kill -9 $PID && wait $PID; } 2>/dev/null;
fi;

src/server.js

import { exec } from 'child_process';

/* ...skipped for brevity... */

process.on('uncaughtException', (err) => {
  if (/EADDRINUSE/.test(err.message)) {
    exec(`sh nodemon.sh`);
  } else {
    console.error("uncaughtException:", err.message);
  }
});

// or better:
server.on('error', err => {
  if (err.code === 'EADDRINUSE') {
    exec(`sh nodemon.sh`);
  }
});

الحيلة هي قتل المنفذ عندما يبدأ nodemon ، وليس عند إعادة تشغيله / تعطله.

لقد استخدمت process.exit () بدلاً من exec () وتعمل بشكل جيد. شكرا!

لقد واجهت هذه المشكلة اليوم واكتشفت أنه عندما أقوم بتشغيل nodemon مباشرة من وحدة التحكم ، فإنها تعمل مثل السحر ولكن عند استخدام العقدة مثل

"scripts": {
    "debug": "nodemon"
}

حصلت على هذا الخطأ

[nodemon] restarting due to changes... 
Error: listen EADDRINUSE :::5000
    at Object._errnoException (util.js:1022:11)
    at _exceptionWithHostPort (util.js:1044:20)
    at Server.setupListenHandle [as _listen2] (net.js:1367:14)
    at listenInCluster (net.js:1408:12)
    at Server.listen (net.js:1492:7)
    at Function.listen (/home/logan/dev/dev-connector/node_modules/express/lib/application.js:618:24)
    at Object.<anonymous> (/home/logan/dev/dev-connector/server.js:33:5)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3
[nodemon] app crashed - waiting for file changes before starting...

حل نمط Node.js (يعمل في أنظمة تشغيل Mac و Linux و Windows):

yarn add kill-port

بعملة nodemon.json :

{
  "events": {
    "restart": "kill-port 5000",
    "crash": "kill-port 5000"
  },
 "delay": "1500"
}

استبدل المنفذ الخاص بك:

"restart": "kill-port [my port]",

ريمي ، أعتقد أنني تمكنت من تجميع الحد الأدنى من الريبو الذي يكرر هذا: راجع https://github.com/chrisveness/koa-hello-world.

بالنسبة لي ، سيؤدي هذا الريبو إلى تشغيل Error: listen EADDRINUSE :::3000 عند تغيير أي رمز. إذا قمت بإزالة الخيار -r dotenv/config من البرنامج النصي start-dev في package.json ، فكل شيء يعمل بشكل جيد.

أنا أقوم بتشغيل Node v10.13.0 على Linux Mint 18 (Ubuntu 16.04 - Xenial).

يمكن لـ remy التكرار عبر نموذج مشروع nestjs :

مستندات nest: https://docs.nestjs.com/first-steps

$ npm i -g @nestjs/cli
$ nest new project

قم بتحديث أي ملف .ts في نموذج المشروع ، سترى Error: listen EADDRINUSE

بيئي: MacOS , Node v10.9.0 ، "nodemon": "^ 1.18.6" ،

forsigner نفس الخطأ مع nest ، js

استخدم هذا بدلاً من حزمة npm:

events": {
    "restart": "kill $(lsof -t -i:4444)",
    "crash": "kill $(lsof -t -i:4444)"
  }

يعمل في لينكس

nzvtrk هل ترغب في التوسع في ما يفعله lsof -t -i:4444 وكيف يعمل هذا الحل؟

lsof يشبه Unix فقط لذا لا يمكنك استخدام هذا الأمر على النوافذ أعتقد أن kill-port هو الحل الأفضل.

FWIW ، هذا يحدث لي فقط عند تشغيل nodemon من خلال نص غزل ( "test-watch": "nodemon --exec 'yarn test'" ).
عند تشغيل nodemon --exec 'yarn test'" مباشرة ، لا يحدث ذلك.

بالنسبة لي ، يحدث هذا فقط عندما أستخدم Babel مع إصدارات أحدث من nodemon تمر عبر نص برمجي الغزل.

1.13.3 - آخر إصدار عمل
1.14.0 - معطلة في جميع الإصدارات اللاحقة

كنت أواجه نفس المشكلة وفي أحدث إصدار - 1.18.7 يبدو أن هذا قد تم إصلاحه. هتافات!!

نعم ، يبدو أن [email protected] قد

نعم! 1.18.7 يعمل!

1.18.7 لديه نفس المشكلة هنا.

بالنسبة لي ، يظهر الخطأ الدقيق (@ 1.18.7) ولكن كل شيء آخر يعمل (تحديثات الكود)

لم يعد بإمكاني استخدام nodemon بسبب هذه المشكلة ، للأسف. يحدث في كل مرة ما لم أقتل النسخة السابقة. أنا على windows 7.

لقد جربت الحل الذي اقترحه forsigner دون نجاح ، فقد أدى إلى ظهور الخطأ "العنوان قيد الاستخدام" _في كل مرة كنت أقوم بتشغيل العقدة ، _ حتى إذا كنت قد قمت للتو باستخدام Taskkill المثيل السابق يدويًا. لا أستطيع أن أتخيل لماذا.

من الأفضل تجنب تصحيح الأخطاء بالخيال وإلقاء نظرة على كيف ولماذا تعطلها.

أنت تعلق أيضًا على مشكلة أثيرت بشأن إصدار أقدم بكثير من nodemon ، على جهاز Mac لا يوجد شيء للاختبار به. سأقوم بإغلاق هذه المشكلة على أمل أنه إذا كان أي شخص _ لا يزال _ يرى مشكلات مماثلة ، فسوف يقوم بذلك: طرح مشكلة جديدة ، وتضمين تفاصيل متكررة ( مع رمز ) وربما حتى البحث لمعرفة ما إذا كان هناك إصلاح يمكنه إرساله العلاقات العامة 👍

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

fabianMendez picture fabianMendez  ·  4تعليقات

Exeteres picture Exeteres  ·  4تعليقات

Bastorx picture Bastorx  ·  5تعليقات

medoix picture medoix  ·  4تعليقات

jagged3dge picture jagged3dge  ·  4تعليقات