Я хочу запустить простой bash-скрипт (называемый ниже killprocess.sh), чтобы убить определенный процесс / службу, работающую на определенном порту (скажем, 8080) на удаленном компьютере, где на обоих установлена ОС Ubuntu 18.04.1 LTS.
Я установил соединение через ssh (openssh) следующим образом для выполнения скрипта. Соединение тоже установлено успешно.
sshpass -p "password" ssh -n user@172.16.20.70 -f "/bin/bash /home/killprocess.sh"
Ниже приводится содержимое killprocess.sh.
processID=$(lsof -t -i:8080)
echo $processID
kill $processID
Хотя он правильно печатает идентификатор процесса на консоли, он выдает сообщение об ошибке ниже, что означает, что его невозможно убить.
: аргументы должны быть идентификаторами процесса или задания
Запустить fromdos killprocess.sh
команда для работы вашего скрипта (она включена в tofrodos
пакет).
Вот почему.
Сообщение об ошибке предполагает, что вы написали свой сценарий в текстовом редакторе Windows, который по-разному обрабатывает окончания строк (добавление \r\n
до конца строки, а не просто \n
). Сообщение об ошибке подозрительно, потому что оно должно быть примерно таким:
bash: kill: meh: arguments must be process or job IDs
Он выведет такую строку, как вы упомянули, только если аргумент kill
команда содержала \r
(возврат каретки) символ. Таким образом, когда сообщение об ошибке печатается перед третьим двоеточием, курсор возвращается в начало строки, а остальная часть сообщения об ошибке перезаписывает все, что было напечатано до сих пор. Это также объясняет, почему kill
команда пожаловалась: получила что-то вроде 1234\r
, который не может быть идентификатором процесса.
Скорее всего, это потому, что первая строка вашего скрипта на самом деле
processID=$(lsof -t -i:8080)\r
но ты не видишь \r
символ конечно, так как он непечатаемый. Вы не можете увидеть его на выходе второй строки, поскольку он выводит строку, курсор возвращается в начало, но затем символ новой строки заставляет курсор перейти на следующую строку.
Кстати, проблема с окончанием строки unix / windows всегда подозревается, если сообщение об ошибке bash начинается с двоеточия.