2017-12-03 6 views
1

Ich habe eine Elixir-Anwendung, die die folgende Art und Weise strukturiert:Elixier: Die Anwendung wird sofort beendet oder erhält keine Eingaben, wenn das Destillerie-Paket ausgeführt wird. Warum funktioniert das so und wie kann man damit umgehen?

Application --> Supervisor --> Worker 

Das Applikationsmodul recht einfach ist, hat es ein use Application und

def start(_type, _args) 
    MyApp.Supervisor.start_link() 
end 

Das Supervisor ein bisschen komplizierter ist:

wo halt_exit(pid) führt eine Process.sleep(100) und ruft sich dann jedes Mal, wenn es findet Die Prozess-PID ist noch am Leben (oder gibt einfach nil zurück, wenn PID nicht mehr aktiv ist) und wait_for_child findet die PID des Worker-Moduls (unter Berücksichtigung, dass sie möglicherweise warten muss, bis sie gestartet wird).

Mein Worker-Modul interagiert mit dem Benutzer unter Verwendung von IO.puts und IO.gets. Warum all das komplizierte unnötige Logik? Es scheint, dass

  • wenn Mix Lauf mit und Anhalten Ausfahrt weglassen, sofort die Anwendung stirbt
  • wenn Mix Freisetzung mit (Brennerei) und myapp.bat console von cmd laufen und lassen Anhalten Ausgang, meine Anwendung startet, sofort stirbt, und Dann wird iex gestartet
  • bei der Verwendung Mix Release w/myapp.bat console und halten Beenden, meine App korrekt ausgegeben, kann aber keine Eingabe erhalten (und damit meine ich kann nicht in das Fenster von werl.exe eingeben)
  • bei Verwendung von Mix Release w/myapp.bat foreground startet meine App und nur dann Es liegt ein Fehler in der Batch-Datei vor (Das System kann die Datei `% get_pid_cmd%` nicht finden. FEHLER: Der Suchfilter kann nicht erkannt werden. '@call' wird nicht als interner oder externer Befehl erkannt, ausführbare Programm- oder Batchdatei.) An diesem Punkt wird meine App beendet.
  • wenn Mix Lauf --no-Halt mit (kein Exit-Halte Logik innerhalb app), meine app startet, sofort beendet und die erlang VM bleibt im cmd Fenster nur
  • laufen, wenn ich laufen mischen und umfassen halt_exit/1 wird meine app als

Von all dies erwartet funktioniert, stellte ich fest, dass 1) der Moment start/2 kehrt meines Anwendungsmodul wird die App heruntergefahren, was nicht viel Sinn macht, als Elixier ist entworfen für Anwendungen, die andere Prozesse belasten statt, nicht neben das Hauptmodul der Anwendung. 2) Die Eingabe erfolgt über den Prozess des Hauptanwendungsmoduls (aber aus irgendeinem Grund nur, wenn es in einem separaten Fenster von werl.exe ausgeführt wird, scheint gut mit dem Mix-Lauf zu funktionieren), so dass ich keine Blockierung bis zum Ende der Arbeit vornehmen kann Logik dort, wenn ich meine Benutzereingabe möchte.

Wie kann ich das lösen, und ebenso wichtig (damit ich zukünftige Probleme vermeiden kann), welches Verhalten mein Problem verursacht? Ich müsste in der Lage sein, dies auf einem Computer ohne Mix und Erlang VM laufen zu lassen, also ist meine einzige Option, es mit dem erzeugten Brennerei-Paket arbeiten zu lassen, was ich im Moment nicht kann.

Keine Menge von googling hat mich zu ähnlichen Taktiken geführt, künstlich zu stoppen Ausgang, und kein Forum/Tutorial habe ich erwähnt Probleme mit diesem "frühen Ausgang", also denke ich, der richtige Weg, um dies zu lösen wäre irgendwie es möchte nicht beendet werden, während ein Prozess ausgeführt wird.

+0

Ich denke, das hat etwas mit dem 'group_leader' System in Erlang zu tun. (https://stackoverflow.com/a/36410816/1650580) –

Antwort

0

The system cannot find the file %get_pid_cmd% . ERROR: The search filter cannot be recognised

In der folgenden Zeile:

@for /f "delims=" %%i in (`%%get_pid_cmd%%`) do set pid=%%i 

Versuchen Sie, die Backticks um %%get_pid_cmd%% auf einfache Anführungszeichen zu ändern.

Auch in der folgenden Zeile:

set get_pid_cmd=%escript% %nodetool% eval %node_type% %node_name% -setcookie "!cookie!" "erlang:list_to_integer(os:getpid()).' 

ändert die endgültige Apostroph zu einem doppelten Anführungszeichen.

Quelle: https://www.bountysource.com/issues/50408118-starting-in-foreground-mode-on-windows-fails-to-get-pid-and-returns-errorlevel-1

machen diese beiden Änderungen in boot_win.eex, die _build Ordner löschen und Wiederaufbau für mich gearbeitet.

Verwandte Themen