


Detaillierte Erläuterung mehrerer Methoden zum aktiven Beenden des Node.js-Prozesses
In diesem Artikel werden einige Methoden vorgestellt, mit denen Sie die Beendigung des Node-Prozesses aktiv auslösen können. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Es gibt mehrere Gründe, warum der Node.js-Prozess beendet werden kann. Einige davon sind vermeidbar, z. B. wenn ein Fehler ausgelöst wird, während andere nicht vermeidbar sind, z. B. nicht genügend Arbeitsspeicher. Der globale Prozess
ist eine Event Emitter-Instanz, die ein exit
-Ereignis ausgibt, wenn die Ausführung normal beendet wird. Der Programmcode kann dann abschließende synchronisierte Bereinigungsarbeiten durchführen, indem er dieses Ereignis abhört. process
是一个 Event Emitter 实例,当执行正常退出时,将发出一个 exit
事件。然后程序代码可以通过侦听这个事件来执行最后的同步清理工作。
相关推荐:《nodejs 教程》
下面是可以主动触发进程终止的一些方法:
操作 | 例子 |
---|---|
手动流程退出 | process.exit(1) |
未捕获的异常 | throw new Error() |
未兑现的 promise | Promise.reject() |
忽略的错误事件 | EventEmitter#emit('error') |
未处理的信号 | $ kill <PROCESS_ID> | Verwandte Empfehlungen: „nodejs Tutorial
Operation | Example | 🎜|||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Manueller Prozessausgang🎜 |
process.exit(1) 🎜🎜 |
|||||||||||||||||||||||||||||||||||||||||||||
Ungefangene Ausnahme🎜 |
throw new Error() 🎜🎜 |
|||||||||||||||||||||||||||||||||||||||||||||
Unerfülltes Versprechen🎜 |
Promise.reject() 🎜🎜 |
|||||||||||||||||||||||||||||||||||||||||||||
Ignoriertes Fehlerereignis🎜 |
EventEmitter# emit('error ') 🎜🎜 |
|||||||||||||||||||||||||||||||||||||||||||||
Unbehandeltes Signal🎜 |
$ kill <PROCESS_ID> 🎜🎜🎜🎜Viele davon werden versehentlich ausgelöst, beispielsweise durch nicht erkannte Fehler oder nicht behandelte Zusagen, aber einige von ihnen werden erstellt, um den Prozess direkt zu beenden. Prozess-ExitDie Verwendung von 直接调用 $ node -e "process.exit(42)" $ echo $? Nach dem Login kopieren 在这种情况下,单行的 Node.js 程序不会输出任何信息,尽管 shell 程序确实会打印退出状态。遇到这样的进程退出,用户将无法理解究竟发生了什么事情。所以要参考下面这段程序配置错误时会执行的代码: function checkConfig(config) { if (!config.host) { console.error("Configuration is missing 'host' parameter!"); process.exit(1); } } Nach dem Login kopieren 在这种情况下,用户没会很清楚发生了什么。他们运行这个程序,将错误输出到控制台上,并且他们能够纠正这个问题。
exceprion、rejection 和发出的 Error虽然
在使用 虽然你应该使用带有 Node.js 内部库中常用的另一种模式是提供一个 可悲的是,一种更常用的区分错误的模式是检查 当引发未捕获的错误时,控制台中将打印栈跟踪信息,并且进程将回以退出状态 1 终止。这是此类异常的例子: /tmp/foo.js:1 throw new TypeError('invalid foo'); ^ Error: invalid foo at Object.<anonymous> (/tmp/foo.js:2:11) ... TRUNCATED ... at internal/main/run_main_module.js:17:47 Nach dem Login kopieren 上面的栈跟踪片段表明错误发生在名为 全局的 const logger = require('./lib/logger.js'); process.on('uncaughtException', (error) => { logger.send("An uncaught exception has occured", error, () => { console.error(error); process.exit(1); }); }); Nach dem Login kopieren Promise 拒绝与抛出错误非常相似。如果 Promise 中的 Promise.reject(new Error('oh no')); (async () => { throw new Error('oh no'); })(); Nach dem Login kopieren 这是输出到控制台的消息: (node:52298) UnhandledPromiseRejectionWarning: Error: oh no at Object.<anonymous> (/tmp/reject.js:1:16) ... TRUNCATED ... at internal/main/run_main_module.js:17:47 (node:52298) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). Nach dem Login kopieren 与未捕获的异常不同,从 Node.js v14 开始,这些 rejection 不会使进程崩溃。在未来的 Node.js 版本中,会使当前进程崩溃。当这些未处理的 rejection 发生时,你还可以拦截事件,侦听 process.exit() wird kein impliziter Text in die Konsole geschrieben. Wenn Sie Code schreiben, der diese Methode mit einer Fehlerdarstellung aufruft, sollte Ihr Code den Fehler an den Benutzer ausgeben, um ihn bei der Lösung des Problems zu unterstützen. Führen Sie beispielsweise den folgenden Code aus: 🎜process.on('unhandledRejection', (reason, promise) => {}); Nach dem Login kopieren Nach dem Login kopieren events.js:306 throw err; // Unhandled 'error' event ^ Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined) at EventEmitter.emit (events.js:304:17) at Object.<anonymous> (/tmp/foo.js:1:40) ... TRUNCATED ... at internal/main/run_main_module.js:17:47 { code: 'ERR_UNHANDLED_ERROR', context: undefined } Nach dem Login kopieren Nach dem Login kopieren process.exit() -Methode ist sehr leistungsfähig. Obwohl es im Programmcode eigene Verwendungsmöglichkeiten hat, sollte es niemals in eine wiederverwendbare Bibliothek eingeführt werden. Wenn in der Bibliothek ein Fehler auftritt, sollte dieser Fehler ausgegeben werden, damit das Programm entscheiden kann, wie damit umgegangen werden soll. 🎜🎜🎜Ausnahme, Ablehnung und ausgegebener Fehler🎜🎜🎜Während process.exit() nützlich ist, müssen Sie für Laufzeitfehler andere Tools verwenden. Wenn ein Programm beispielsweise eine HTTP-Anfrage verarbeitet, sollte ein Fehler im Allgemeinen den Prozess nicht beenden, sondern nur eine Fehlerantwort zurückgeben. Es ist auch nützlich zu wissen, wo der Fehler aufgetreten ist, d. h. wohin das Error -Objekt geworfen werden soll. 🎜🎜Instanzen der Klasse Error enthalten nützliche Metadaten darüber, was den Fehler verursacht hat, wie z. B. Stack-Trace-Informationen und Nachrichtenzeichenfolgen. Es ist üblich, Ihre eigene Fehlerklasse von Error zu erweitern. Das Instanziieren von Error allein hat nicht viele Nebenwirkungen und muss ausgelöst werden, wenn ein Fehler auftritt. 🎜🎜Wenn das Schlüsselwort throw verwendet wird oder bestimmte Logikfehler auftreten, wird ein Error ausgelöst. Wenn dies geschieht, wird der aktuelle Stapel „entrollt“, was bedeutet, dass jede Funktion beendet wird, bis eine aufrufende Funktion den Aufruf in eine try/catch -Anweisung umschließt. Nachdem diese Anweisung gefunden wurde, wird der Zweig catch aufgerufen. Wenn der Fehler nicht in einem try/catch eingeschlossen ist, gilt der Fehler als nicht abgefangen. 🎜🎜Während Sie technisch gesehen das Schlüsselwort throw mit Error verwenden sollten, z. B. throw new Error('foo') , können Sie alles werfen. Sobald etwas ausgelöst wird, gilt es als Ausnahme. Es ist wichtig, Error -Instanzen auszulösen, da der Code, der diese Fehler abfängt, höchstwahrscheinlich ein Fehlerattribut erwartet. 🎜🎜Ein weiteres Muster, das häufig in den internen Bibliotheken von Node.j verwendet wirdist die Bereitstellung von A .code -Attribut, das ein Zeichenfolgenwert ist, der zwischen den Versionen konsistent sein sollte. Beispielsweise ist der falsche .code -Wert ERR_INVALID_URI . Auch wenn sich das für Menschen lesbare .message -Attribut ändern kann, ist dieser code < /code>-Werte sollten ebenfalls nicht geändert werden. 🎜🎜Leider besteht ein häufigeres Muster zur Unterscheidung von Fehlern darin, das Attribut <code>.message zu überprüfen, das normalerweise dynamisch ist, da Rechtschreibfehler möglicherweise behoben werden müssen. Diese Methode ist sehr riskant und fehleranfällig. Im Node.js-Ökosystem gibt es keine perfekte Lösung, um Fehler in allen Bibliotheken zu unterscheiden. 🎜🎜Wenn ein nicht erfasster Fehler auftritt, wird ein Stack-Trace in der Konsole gedruckt und der Prozess wird mit Exit-Status 1 beendet. Hier ist ein Beispiel für eine solche Ausnahme: 🎜#!/usr/bin/env node console.log(`Process ID: ${process.pid}`); process.on('SIGHUP', () => console.log('Received: SIGHUP')); process.on('SIGINT', () => console.log('Received: SIGINT')); setTimeout(() => {}, 5 * 60 * 1000); // keep process alive Nach dem Login kopieren Nach dem Login kopieren foo.js aufgetreten ist. 🎜🎜Der globale Prozess ist ein Ereignisemitter, der nicht erfasste Fehler abfangen kann, indem er auf das Ereignis uncaughtException lauscht. Hier ist ein Beispiel für die Verwendung, bei der Fehler vor dem Beenden abgefangen werden, um eine asynchrone Nachricht zu senden: 🎜$ kill -s SIGHUP <PROCESS_ID> Nach dem Login kopieren Nach dem Login kopieren reject() im Promise aufgerufen wird oder wenn in einer asynchronen Funktion ein Fehler auftritt. In dieser Hinsicht sind die folgenden beiden Beispiele ungefähr gleich: 🎜$ node -e "process.kill(<PROCESS_ID>, 'SIGHUP')" Nach dem Login kopieren Nach dem Login kopieren $ kill -9 <PROCESS_ID> Nach dem Login kopieren Nach dem Login kopieren process -Objekt warten: 🎜process.on('unhandledRejection', (reason, promise) => {}); Nach dem Login kopieren Nach dem Login kopieren 事件发射器是 Node.js 中的常见模式,许多对象实例都从这个基类扩展而来,并在库和程序中使用。它们非常欢迎,值得和 error 与 rejection 放在一起讨论。 当事件发射器发出没有侦听器的 events.js:306 throw err; // Unhandled 'error' event ^ Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined) at EventEmitter.emit (events.js:304:17) at Object.<anonymous> (/tmp/foo.js:1:40) ... TRUNCATED ... at internal/main/run_main_module.js:17:47 { code: 'ERR_UNHANDLED_ERROR', context: undefined } Nach dem Login kopieren Nach dem Login kopieren 确保在你使用的事件发射器实例中侦听 信号信号是操作系统提供的机制,用于把用数字表示的消息从一个程序发送到另一个程序。这些数字通常用等价的常量字符串来表示。例如,信号 不同的操作系统可以定义不同的信号,但是下面列表中的信号一般是通用的:
如果程序可以选择实现信号处理程序,则 Handleable 一列则为是。为否的两个信号无法处理。 Node.js 默认 这一列告诉你在收到信号时,Node.js 程序的默认操作是什么。最后一个信号用途指出了信号对应的作用。 在 Node.js 程序中处理这些信号可以通过侦听 #!/usr/bin/env node console.log(`Process ID: ${process.pid}`); process.on('SIGHUP', () => console.log('Received: SIGHUP')); process.on('SIGINT', () => console.log('Received: SIGINT')); setTimeout(() => {}, 5 * 60 * 1000); // keep process alive Nach dem Login kopieren Nach dem Login kopieren 在终端窗口中运行这个程序,然后按 $ kill -s SIGHUP <PROCESS_ID> Nach dem Login kopieren Nach dem Login kopieren 这演示了一个程序怎样向另一个程序发送信号,并且在第一个终端中运行的 Node.js 程序中输出它所接收到的 你可能已经猜到了,Node.js 也能把命令发送到其他程序。可以用下面的命令以把信号从临时的 Node.js 进程发送到你现有的进程: $ node -e "process.kill(<PROCESS_ID>, 'SIGHUP')" Nach dem Login kopieren Nach dem Login kopieren 这还会在你的第一个程序中显示 $ kill -9 <PROCESS_ID> Nach dem Login kopieren Nach dem Login kopieren 这时程序应该结束。 这些信号在 Node.js 程序中经常用于处理正常的关闭事件。例如,当 Kubernetes Pod 终止时,它将向程序发送 更多编程相关知识,请访问:编程视频!! |
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung mehrerer Methoden zum aktiven Beenden des Node.js-Prozesses. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Welcher Prozess ist explorer.exe? Wenn wir das Windows-Betriebssystem verwenden, hören wir oft den Begriff „explorer.exe“. Sind Sie neugierig, was dieser Prozess ist? In diesem Artikel erklären wir ausführlich, was der Prozess explorer.exe ist und welche Funktionen und Auswirkungen er hat. Zunächst einmal ist explorer.exe ein Schlüsselprozess des Windows-Betriebssystems. Er ist für die Verwaltung und Steuerung des Windows Explorers (Windows) verantwortlich

ccsvchst.exe ist eine allgemeine Prozessdatei, die Teil der Symantec Endpoint Protection (SEP)-Software ist, und SEP ist eine Endpoint Protection-Lösung, die vom bekannten Netzwerksicherheitsunternehmen Symantec entwickelt wurde. Als Teil der Software ist ccsvchst.exe für die Verwaltung und Überwachung SEP-bezogener Prozesse verantwortlich. Werfen wir zunächst einen Blick auf SymantecEndpointProtection(

In Linux-Systemen sind Zombie-Prozesse spezielle Prozesse, die beendet wurden, aber noch im System verbleiben. Obwohl Zombie-Prozesse nicht viele Ressourcen verbrauchen, können sie bei zu vielen Ressourcen zur Erschöpfung der Systemressourcen führen. In diesem Artikel erfahren Sie, wie Sie Zombie-Prozesse korrekt entfernen, um den normalen Betrieb des Systems sicherzustellen. 1Linux-Zombie-Prozess Nachdem der untergeordnete Prozess seine Aufgabe abgeschlossen hat und der übergeordnete Prozess den Status nicht rechtzeitig überprüft, wird der untergeordnete Prozess zu einem Zombie-Prozess. Der untergeordnete Prozess wartet auf die Bestätigung des übergeordneten Prozesses und das System wird ihn erst wiederverwenden, wenn er abgeschlossen ist. Andernfalls bleibt der Zombie-Prozess weiterhin im System hängen. Um zu überprüfen, ob Zombie-Prozesse im System vorhanden sind, können Sie den Befehl top ausführen, um alle laufenden Prozesse und mögliche Zombie-Prozesse anzuzeigen. Das Ergebnis des Befehls „top“ ist in der Abbildung oben unter Linux zu sehen.

Detaillierte Erläuterung der Linux-Prozessprioritätsanpassungsmethode Im Linux-System bestimmt die Priorität eines Prozesses seine Ausführungsreihenfolge und Ressourcenzuteilung im System. Eine angemessene Anpassung der Priorität des Prozesses kann die Leistung und Effizienz des Systems verbessern. In diesem Artikel wird detailliert beschrieben, wie Sie die Priorität des Prozesses unter Linux anpassen, und es werden spezifische Codebeispiele bereitgestellt. 1. Überblick über die Prozesspriorität Im Linux-System ist jedem Prozess eine Priorität zugeordnet. Der Prioritätsbereich liegt im Allgemeinen zwischen -20 und 19, wobei -20 die höchste Priorität und 19 die höchste Priorität darstellt

PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools In der heutigen Zeit der rasanten Entwicklung des Internets ist die Front-End-Entwicklung immer wichtiger geworden. Da Benutzer immer höhere Anforderungen an das Erlebnis von Websites und Anwendungen stellen, müssen Frontend-Entwickler effizientere und flexiblere Tools verwenden, um reaktionsfähige und interaktive Schnittstellen zu erstellen. Als zwei wichtige Technologien im Bereich der Front-End-Entwicklung können PHP und Vue.js in Kombination als perfekte Waffe bezeichnet werden. In diesem Artikel geht es um die Kombination von PHP und Vue sowie um detaillierte Codebeispiele, die den Lesern helfen sollen, diese beiden besser zu verstehen und anzuwenden

Warum schlafen Prozesse unter Linux? Im Linux-Betriebssystem kann ein Prozess aus verschiedenen Gründen und Bedingungen in den Ruhezustand geraten. Wenn sich ein Prozess in einem Ruhezustand befindet, bedeutet dies, dass der Prozess vorübergehend angehalten ist und die Ausführung nicht fortsetzen kann, bis bestimmte Bedingungen erfüllt sind, bevor er zur Fortsetzung der Ausführung aktiviert werden kann. Als Nächstes werden wir einige häufige Situationen, in denen ein Prozess unter Linux in den Ruhezustand wechselt, im Detail vorstellen und sie anhand spezifischer Codebeispiele veranschaulichen. Warten auf den Abschluss der E/A: Wenn ein Prozess einen E/A-Vorgang initiiert (z. B. Lesen).

In Front-End-Entwicklungsinterviews decken häufige Fragen ein breites Themenspektrum ab, darunter HTML/CSS-Grundlagen, JavaScript-Grundlagen, Frameworks und Bibliotheken, Projekterfahrung, Algorithmen und Datenstrukturen, Leistungsoptimierung, domänenübergreifende Anfragen, Front-End-Engineering, Designmuster sowie neue Technologien und Trends. Interviewerfragen sollen die technischen Fähigkeiten, die Projekterfahrung und das Verständnis des Kandidaten für Branchentrends beurteilen. Daher sollten Kandidaten in diesen Bereichen umfassend vorbereitet sein, um ihre Fähigkeiten und Fachkenntnisse unter Beweis zu stellen.

Django ist ein in Python geschriebenes Webanwendungs-Framework, das Wert auf schnelle Entwicklung und saubere Methoden legt. Obwohl Django ein Web-Framework ist, müssen Sie zur Beantwortung der Frage, ob Django ein Front-End oder ein Back-End ist, ein tiefes Verständnis der Konzepte von Front-End und Back-End haben. Das Front-End bezieht sich auf die Schnittstelle, mit der Benutzer direkt interagieren, und das Back-End bezieht sich auf serverseitige Programme. Sie interagieren mit Daten über das HTTP-Protokoll. Wenn das Front-End und das Back-End getrennt sind, können die Front-End- und Back-End-Programme unabhängig voneinander entwickelt werden, um Geschäftslogik bzw. interaktive Effekte sowie den Datenaustausch zu implementieren.
