Как передать переменную сценария оболочки в erlang:exit()?

#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 by erlang:exit(c:pid('$pid'),kill). , и это решит проблему.