#rabbitmq #erlang
#rabbitmq #erlang
Вопрос:
Я пытаюсь удалить застрявшие процессы в RMQ с помощью команды rabbitmqctl eval 'erlang:exit(c:pid("'$pid'"),kill).'
, но у меня ошибка ниже.
Error:
{:undef, [{:c, :pid, ['0,159,0'], []}, {:erl_eval, :do_apply, 6, [file: 'erl_eval.erl', line: 680]}, {:erl_eval, :expr_list, 6, [file: 'erl_eval.erl', line: 888]}, {:erl_eval, :expr, 5, [file: 'erl_eval.erl', line: 411]}, {:erl_eval, :exprs, 2, []}]}
Есть идеи по устранению этой ошибки? Что я здесь делаю не так?
Комментарии:
1. Каков тип и значение
"'$pid'"
. Глядя на сообщение об ошибке, оно выглядит как строка, и в этом случаеerlang:exit(c:pid(list_to_pid("'$pid'")),kill)
должно работать
Ответ №1:
c:pid/3 принимает 3 целых числа, а не строку, если вы хотите использовать строку, используйте list_to_pid/1 .
Проблема здесь в том, что вы пытаетесь вызвать
c:pid("0,159,0"),
и это должно быть либо
c:pid(0,159,0)
или
list_to_pid("<0.159.0>")
Комментарии:
1. Я подумал о c: pid(«0,159,0») и подозревал, что причиной может быть tat. Но у меня все еще есть вопрос, как мне передать Pid, чтобы он мог быть
c:pid(0,159,0)
илиlist_to_pid("<0.159.0>")
.. Я пытаюсь такrabbitmqctl eval 'erlang:exit(list_to_pid("'$pid'"),kill).'
. Но все еще не работает.2. @dharpatel если ваша переменная $pid
0.159.0
равна (обратите внимание на точки) и вы используетеlist_to_pid
, вам не хватает заключающего<>
:$ erl -eval 'exit(list_to_pid("<'$PROCESS_ID'>"),kill).'
3. @dharpatel и если вы используете запятые (
0,159,0
), вы можете использоватьc:pid
:erl -eval 'exit(c:pid('$PROCESS_ID'),kill).'
4. Спасибо, Хосе. Проблема уже была решена с.
erlang:exit(c:pid('$pid'),kill)
Но альтернативная команда, которую вы предлагаете, также будет работать. Спасибо за помощь.
Ответ №2:
erlang:exit(c:pid("'$pid'"),kill)
exit/2
принимает два аргумента: a pid
и любой термин erlang (например, atom kill
). A pid
не является ни строкой, ни целым числом, скорее это его собственный тип, который возвращается некоторыми функциями, например self/0
. erlang выводит pid в оболочку следующим образом:
<0.64.0>
Весь вывод в оболочку представляет собой строку, но это не означает, что pid является строкой внутри, поэтому вы не можете создать pid путем записи "<0.64.0>"
, точно так же, как вы не можете создать целое число путем записи "10"
.
Скажем, если у вас уже есть pid $pid
, вам не нужно преобразовывать его в другой тип, потому что первый аргумент for exit/2
определен как тип pid, поэтому вы должны вызвать exit() следующим образом:
erlang:exit('$pid',kill)
Комментарии:
1.
rabbitmqctl eval 'erlang:exit('$pid',kill).'
. также не работает. это выдает ошибку.Error: {:undef, [{:erlang, :exit, [0, 159, 0, :kill], []}, {:erl_eval, :do_apply, 6, [file: 'erl_eval.erl', line: 680]}, {:erl_eval, :exprs, 2, []}]}
2. Я получил решение. В основном
erlang:exit('$pid',kill)
выдавалundef
ошибку. Итак, мне нужно определить fun byerlang:exit(c:pid('$pid'),kill).
, и это решит проблему.