Я получил сообщение об ошибке «bash: строка 1: [: -ne: ожидается унарный оператор» после запуска приведенного ниже сценария

Когда вы запускаете сценарий, он создает подоболочку, в которой выполняется команда. Любые процессы, включая запущенные фоновые процессы, такие как команда ssh, присоединяются к этой подоболочке. Если подоболочка завершается, фоновый процесс также уничтожается. Вместо этого попробуйте запустить процесс ssh как команду nohup в сценарии 1. Ответ, вдохновленный:Запустите фоновый процесс из сценария и управляйте им, когда сценарий завершится

Команды, отправленные через ssh, присоединяются к процессу ssh, и процесс ssh должен продолжать работать, чтобы команды могли выполняться. Выход из процесса ssh приведет к завершению любых фоновых процессов на машине B, поскольку они подключены к подоболочке, созданной для сценария 2. Здесь также пригодится Nohup.

Но поскольку ваш процесс выполняется на машине B, но, по-видимому, зависает и не завершается преждевременно, преждевременное завершение процесса ssh не кажется проблемой.

Проблемы с сетью также маловероятны, поскольку они, скорее всего, завершат процесс ssh и прекратят процессы, запущенные на машине B. Кроме того, если проблемы с сетью не настолько серьезны, чтобы остановить процесс ssh, они не должны влиять на процессы, работающие на машине. B. Вероятно, что-то в сценарии 2 на машине B вызывает зависание. Один из способов доказать, что эта логика неверна, — завершить процесс ssh на машине A и посмотреть, что произойдет на машине B.

Наконец, лучше всего запустить команду ssh в качестве процесса nohup, как было предложено в предыдущей ссылке. Кроме того, если ваши команды в сценарии 2 не зависят друг от друга последовательно, я бы также запускал каждую из них, используя nohup.(https://askubuntu.com/questions/349262/run-a-nohup-command-over-ssh-then-disconnect). Я предполагаю, что ничто в сценарии 1 на машине A не зависит от выполнения сценария 2, основываясь на том факте, что у вас есть команда ssh, работающая как фоновый процесс.

0
20.12.2019, 10:30
1 ответ

Основная проблема заключается в том, что команда, отправляемая через ssh, заключена в двойные -кавычки, поэтому $(... )и $UPрасширяются локальной оболочкой до того, как команда будет передана в ssh. команду и оттуда в удаленную оболочку.

Кроме того, кавычки не вложены друг в друга, поэтому двойные -кавычки в командной строке не делают того, что вам нужно. --первая из каждой пары рассматривается как закрытая -кавычка (соответствие что бы ни было перед ним ), раздел, который должен быть заключен в кавычки, тогда вообще не заключен в кавычки, а следующая двойная -кавычка начинает новый раздел в кавычках. Поскольку это кавычки вокруг разделов аргумента, локальная оболочка удаляет их из аргумента перед передачей в ssh.

Между этими двумя вещами и предполагая, что ntpdне работает на локальном компьютере, вот что на самом деле передается на удаленный компьютер в виде команды:

UP=       0;
if [  -ne 1 ];
then
        echo NTP is down.;
        sudo service ntpd start

else
        echo NTP Service is running.;
fi

В выражении [ -ne ]отсутствует левый операнд (помните, кавычки были удалены ), так что [жалуется на это. Я не уверен, почему он думает, что это строка 1, поскольку мне кажется, что это строка 2.

Решение 1 :Используйте одинарные -кавычки для всей команды. Поскольку в нем нет одинарных -кавычек, вложенность не является проблемой, а одинарные -кавычки подавляют расширение всего , поэтому различные $расширения происходят в удаленной системе..

Решение 2 :Передайте команды как документ (в кавычках )здесь -вместо аргумента (Кстати,Я также дважды -процитировал $EMAILMESSAGEпо общим принципам и удалил точки с запятой с концов строк, где они не нужны):

ssh $USR@$host >> "$EMAILMESSAGE" <<'EOF'
UP=$(ps -ef | grep -v grep | grep ntpd | wc -l);
if [ "$UP" -ne 1 ]
then
        echo "NTP is down."
        sudo service ntpd start

else
        echo "NTP Service is running."
fi
EOF

Решение 3 :Пропустите переменную и просто используйте grep -qнепосредственно в качестве теста ifи либо избегайте внутренних двойных -кавычек, либо переключайтесь на одинарные -кавычки:

ssh $USR@$host "if ps -ef | grep -v grep | grep -q ntpd
then
        echo \"NTP is down.\"
        sudo service ntpd start

else
        echo \"NTP Service is running.\"
fi" >> "$EMAILMESSAGE"
3
28.01.2020, 02:21

Теги

Похожие вопросы