Вы предоставили достаточно информации, чтобы определить, в чем проблема, но не как ее исправить.
Сообщение «Синтаксическая ошибка:» («неожиданно» явно исходит из оболочки. Почему оболочка пытается выполнить ваш двоичный файл? Потому что ядро попыталось и отказалось. Когда это происходит, sudo решает, что это может быть оболочка сценарий, у которого отсутствует правильный заголовок и который пытается вызвать оболочку по своему выбору (sudo пытается запустить sh
).
Почему ядро не смогло запустить программу? исполняемый файл находится в неподдерживаемом формате. Это даже не просто из-за того, что он был скомпилирован для неправильной архитектуры (например, попытка запустить 64-разрядный двоичный файл x86 в 32-разрядной системе или наоборот) или для неправильной операционной системы ( например, попытка запустить исполняемый файл FreeBSD в Linux): ядро вообще не распознает файл как имеющий исполняемый формат. Например, если вы пытались запустить это в Linux, это означает, что у вас не ELF двоичный.Среди распространенных операционных систем это может быть вызвано попыткой запустить двоичный файл macOS в Linux или наоборот.
Обратите внимание, что проблема не из-за плохих разрешений или отсутствия библиотек. Если бы одна из этих проблем была проблемой, ядро сообщило бы о другой ошибке, и вместо этого sudo не попытался бы запустить оболочку.
Решение состоит в том, чтобы скомпилировать программу для правильной операционной системы и правильной архитектуры. Если вы не можете скомпилировать на той же машине, на которой запускаете программу, вам может потребоваться установить кросс-компилятор . Если у вас нет возможности перекомпилировать программу, возможно, есть способ запустить ее в эмуляторе, но обычно это намного сложнее и медленнее, чем перекомпиляция, поэтому попробуйте ее только в крайнем случае.
Я заключил команду kill -9 $ (ps -ef | awk "/ service_name / {print \ $ 2}")
в символ '' ' и запустил его с помощью моей утилиты, и это сработало как шарм. Итак, вот последняя команда:
`kill -9 $(ps -ef | awk "/service_name/{print \$2}")`
Не следует вводить grep в awk!
ps -ef | awk '/service_name/ { print $2}' | xargs kill -9
или
pkill service_name
Попробуйте:
ps -ef | grep service_name | awk '{print $2}' | xargs kill -9
Вы можете сначала протестировать его.
На самом деле подстановка команд, которая не является просто подоболочкой, работает отлично. Ваша проблема в том, что вы хотите, чтобы он выполнялся в удаленной системе удаленной оболочкой, потому что процессы, которые вы хотите убить, являются процессами в удаленной системе. Поэтому вы должны процитировать его, который становится немного неуклюжим, хотя вы можете отказаться от grep
, когда у вас есть awk
. Два варианта:
ssh user@remote "kill -9 \$(ps -ef | awk '/service_name/{print $2}')"
ssh user@remote 'kill -9 $(ps -ef | awk "/service_name/{print \$2}")'
Однако лучшим решением этой проблемы на большинстве Linux и некоторых (?) других Unix является pkill
, который выполняет всю работу по поиску процессов, выполняющих определенную команду, и убивает их:
ssh user@remote pkill -9 service_name
В зависимости от того, как запускается процесс, вам может потребоваться поиск по всей командной строке :
ssh user@remote pkill -f -9 service_name