Когда вы запускаете сценарий, он создает подоболочку, в которой выполняется команда. Любые процессы, включая запущенные фоновые процессы, такие как команда 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, работающая как фоновый процесс.
Основная проблема заключается в том, что команда, отправляемая через 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"