iex break 菜单中的 (k)ill 是什么?
What is (k)ill for in the iex break menu?
我通过按 CTRL + C 访问 eix 1.8.2 的中断菜单。它看起来像这样:
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
起初我假设 kill 与 abort 类似(即,只是结束会话),但不是。相反,按 k 会生成核心转储并提供更多选项:
iex(1)>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
k
Process Information
--------------------------------------------------
=proc:<0.105.0>
State: Waiting
Spawned as: erlang:apply/2
Spawned by: <0.75.0>
Message queue length: 0
Number of heap fragments: 1
Heap fragment data: 5
Link list: [{to,<0.64.0>,#Ref<0.720592203.270008322.27074>}]
Reductions: 4202
Stack+heap: 233
OldHeap: 0
Heap unused: 177
OldHeap unused: 0
BinVHeap: 1
OldBinVHeap: 0
BinVHeap unused: 46421
OldBinVHeap unused: 46422
Memory: 2804
Stack dump:
Program counter: 0x000000001f8230e0 (io:execute_request/2 + 200)
CP: 0x0000000000000000 (invalid)
arity = 0
0x000000001ddcee08 Return addr 0x000000001f8a4ba0 ('Elixir.IEx.Server':io_get/3 + 96)
y(0) #Ref<0.720592203.270008322.27074>
y(1) {false,{get_line,unicode,<<"iex(1)> ">>}}
y(2) <0.64.0>
0x000000001ddcee28 Return addr 0x000000001d53ecf8 (<terminate process normally>)
y(0) <0.105.0>
y(1) <0.75.0>
Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL
(k)ill (n)ext (r)eturn:
如果我再次按 k,我会得到另一个核心转储。按 n 也会给我一个核心转储,我认为这与按 k 相同。最后一个选项 r 会根据我之前所做的事情做不同的事情。如果我只按了几次 k 或 n,它就会忽略它,我必须按两次 enter。 iex 像往常一样解释第二个输入和 returns nil
。
(k)ill (n)ext (r)eturn:
r
nil
如果我多次按 k 和 n,它会这样做:
(k)ill (n)ext (r)eturn:
r
** (EXIT from #PID<0.104.0>) shell process exited with reason: killed
Interactive Elixir (1.8.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
09:39:57.929 [info] Application iex exited: killed
或者这个:
(k)ill (n)ext (r)eturn:
r
09:46:20.268 [info] Application iex exited: killed
09:46:20.269 [info] Application elixir exited: killed
09:46:20.274 [error] GenServer IEx.Pry terminating
** (stop) killed
Last message: {:EXIT, #PID<0.88.0>, :killed}
State: 1
或者这个:
(k)ill (n)ext (r)eturn:
r
Logger - error: {removed_failing_handler,'Elixir.Logger'}
Logger - error: {removed_failing_handler,'Elixir.Logger'}
Logger - error: {removed_failing_handler,'Elixir.Logger'}
我不确定它如何决定应该显示哪些消息。
我真的很好奇 (k)ill 及其子选项的作用,并期待了解它。任何方向表示赞赏,谢谢!
查看 source code:
case 'k':
process_killer();
和
switch(j) {
case 'k':
ASSERT(erts_init_process_id != ERTS_INVALID_PID);
/* Send a 'kill' exit signal from init process */
erts_proc_sig_send_exit(NULL, erts_init_process_id,
rp->common.id, am_kill, NIL,
0);
case 'n': br = 1; break;
case 'r': return;
default: return;
}
k 似乎是通过向它们发送终止信号来枚举和终止单个进程。不同的输出是因为它取决于每个进程如何处理信号。
kill 命令遍历所有 运行 个进程,并为每个进程显示一堆信息并询问您是否:
- kill它,进入下一个进程
(k)
- 不杀掉这个就进入下一个进程
(n)
,或者
- 停止终止进程并返回 shell
(r)
。
确定要终止的进程可能比较棘手。您可以查看的一件事是 Dictionary
行,对于大多数 long-running 进程,该行有一个 $initial_call
条目告诉您哪个模块包含此进程是 运行 的代码。例如:
Dictionary: [{'$ancestors',[<0.70.0>]},{iex_evaluator,ack},{'$initial_call',{'Elixir.IEx.Evaluator',init,4}}]
根据您终止的进程显示不同的消息。例如,似乎 Elixir.IEx.Evaluator
是进程 运行 Elixir shell,它给你 shell process exited with reason: killed
错误消息。
一种看待这个问题的方法是它显示了 Elixir 应用程序的容错能力:即使系统中某处的进程出现错误(在这种情况下是由显式终止进程引起的),监管者也会尝试重新启动有问题的进程并保留整个系统 运行.
实际上,我从来没有在运行系统中使用过这种杀死进程的方式。如果您知道要终止的进程的进程 ID ("pid"),您可以在 shell:
中输入类似这样的内容
Process.exit(pid("0.10.0"), :kill)
无需遍历进程列表。
我通过按 CTRL + C 访问 eix 1.8.2 的中断菜单。它看起来像这样:
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
起初我假设 kill 与 abort 类似(即,只是结束会话),但不是。相反,按 k 会生成核心转储并提供更多选项:
iex(1)>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
k
Process Information
--------------------------------------------------
=proc:<0.105.0>
State: Waiting
Spawned as: erlang:apply/2
Spawned by: <0.75.0>
Message queue length: 0
Number of heap fragments: 1
Heap fragment data: 5
Link list: [{to,<0.64.0>,#Ref<0.720592203.270008322.27074>}]
Reductions: 4202
Stack+heap: 233
OldHeap: 0
Heap unused: 177
OldHeap unused: 0
BinVHeap: 1
OldBinVHeap: 0
BinVHeap unused: 46421
OldBinVHeap unused: 46422
Memory: 2804
Stack dump:
Program counter: 0x000000001f8230e0 (io:execute_request/2 + 200)
CP: 0x0000000000000000 (invalid)
arity = 0
0x000000001ddcee08 Return addr 0x000000001f8a4ba0 ('Elixir.IEx.Server':io_get/3 + 96)
y(0) #Ref<0.720592203.270008322.27074>
y(1) {false,{get_line,unicode,<<"iex(1)> ">>}}
y(2) <0.64.0>
0x000000001ddcee28 Return addr 0x000000001d53ecf8 (<terminate process normally>)
y(0) <0.105.0>
y(1) <0.75.0>
Internal State: ACT_PRIO_NORMAL | USR_PRIO_NORMAL | PRQ_PRIO_NORMAL
(k)ill (n)ext (r)eturn:
如果我再次按 k,我会得到另一个核心转储。按 n 也会给我一个核心转储,我认为这与按 k 相同。最后一个选项 r 会根据我之前所做的事情做不同的事情。如果我只按了几次 k 或 n,它就会忽略它,我必须按两次 enter。 iex 像往常一样解释第二个输入和 returns nil
。
(k)ill (n)ext (r)eturn:
r
nil
如果我多次按 k 和 n,它会这样做:
(k)ill (n)ext (r)eturn:
r
** (EXIT from #PID<0.104.0>) shell process exited with reason: killed
Interactive Elixir (1.8.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
09:39:57.929 [info] Application iex exited: killed
或者这个:
(k)ill (n)ext (r)eturn:
r
09:46:20.268 [info] Application iex exited: killed
09:46:20.269 [info] Application elixir exited: killed
09:46:20.274 [error] GenServer IEx.Pry terminating
** (stop) killed
Last message: {:EXIT, #PID<0.88.0>, :killed}
State: 1
或者这个:
(k)ill (n)ext (r)eturn:
r
Logger - error: {removed_failing_handler,'Elixir.Logger'}
Logger - error: {removed_failing_handler,'Elixir.Logger'}
Logger - error: {removed_failing_handler,'Elixir.Logger'}
我不确定它如何决定应该显示哪些消息。
我真的很好奇 (k)ill 及其子选项的作用,并期待了解它。任何方向表示赞赏,谢谢!
查看 source code:
case 'k':
process_killer();
和
switch(j) {
case 'k':
ASSERT(erts_init_process_id != ERTS_INVALID_PID);
/* Send a 'kill' exit signal from init process */
erts_proc_sig_send_exit(NULL, erts_init_process_id,
rp->common.id, am_kill, NIL,
0);
case 'n': br = 1; break;
case 'r': return;
default: return;
}
k 似乎是通过向它们发送终止信号来枚举和终止单个进程。不同的输出是因为它取决于每个进程如何处理信号。
kill 命令遍历所有 运行 个进程,并为每个进程显示一堆信息并询问您是否:
- kill它,进入下一个进程
(k)
- 不杀掉这个就进入下一个进程
(n)
,或者 - 停止终止进程并返回 shell
(r)
。
确定要终止的进程可能比较棘手。您可以查看的一件事是 Dictionary
行,对于大多数 long-running 进程,该行有一个 $initial_call
条目告诉您哪个模块包含此进程是 运行 的代码。例如:
Dictionary: [{'$ancestors',[<0.70.0>]},{iex_evaluator,ack},{'$initial_call',{'Elixir.IEx.Evaluator',init,4}}]
根据您终止的进程显示不同的消息。例如,似乎 Elixir.IEx.Evaluator
是进程 运行 Elixir shell,它给你 shell process exited with reason: killed
错误消息。
一种看待这个问题的方法是它显示了 Elixir 应用程序的容错能力:即使系统中某处的进程出现错误(在这种情况下是由显式终止进程引起的),监管者也会尝试重新启动有问题的进程并保留整个系统 运行.
实际上,我从来没有在运行系统中使用过这种杀死进程的方式。如果您知道要终止的进程的进程 ID ("pid"),您可以在 shell:
中输入类似这样的内容Process.exit(pid("0.10.0"), :kill)
无需遍历进程列表。