Я запускаю удаленный скрипт через SSH так:
ssh user@ipaddress '~/my_script.sh'
Все идет хорошо, но как только скрипт завершен, соединение не закрывается. Я должен нажать CTRL-C, чтобы разорвать текущее соединение.
Я пробовал команду «exit» в «~ / my_script.sh», и она бесполезна. Я пробовал команду "logout" в ~ / my_script.sh и получаю сообщение:
logout: not login shell: use exit
...
Любая идея, как я мог бы сделать, чтобы автоматически и правильно закрыть SSH после завершения сценария?
(Модификация для уточнения :) Вот что внутри моего скрипта:
#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas
umount_disque_qas()
{
# Umount du disque 'qas' s'il n'avait pas été 'umount' :
nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
if [ "$nom_disque_monte" != "" ]
then
echo "For safety, umount : $nom_disque_monte"
umount $nom_disque_monte
fi
}
# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas
echo "--------------------------------"
echo "Install ISO quick address..."
nom_fichier_iso=`ls -t $path_sources_qas | awk '{if (NR==1) {print $1}}'`
echo "Mount disk $nom_fichier_iso..."
mount -o loop -t iso9660 $path_sources_qas/$nom_fichier_iso /mnt/qas
echo "Done."
# All the folders are like this :
# /usr/bin/qas/Data.old.10
# /usr/bin/qas/Data.old.11
# /usr/bin/qas/Data.old.12
# ...
echo "--------------------------------"
echo "Stopping QuickAdress server..."
cd $path_qas_bin/apps/
./wvmgmtd shutdown qaserver:2021
sleep 3
echo "Done."
# Get last number of the folder:
num_dernier_dossier_backup=`ls -Atd $path_qas_bin/Data.old* | awk '{if (NR==1) {print $1}}' | awk -F . '{print $NF}'`
# Add 1 :
let "num_dernier_dossier_backup += 1"
# Full name :
nom_dossier_backup=Data.old.$num_dernier_dossier_backup
echo "--------------------------------"
echo "Saving Data to $nom_dossier_backup..."
cd $path_qas_bin
mv Data $nom_dossier_backup
echo "Done."
echo "--------------------------------"
echo "Copying new folder Data..."
cd $path_qas_bin
cp -r /mnt/qas/Data .
echo "Done."
echo "--------------------------------"
echo "Deleting unused datas..."
cd $path_qas_bin/apps/
rm -f $path_qas_bin/Data/frxmos.dap
echo "Done."
echo "--------------------------------"
echo "Restart server..."
cd $path_qas_bin/apps/
./qaswvd &
sleep 3
echo "Done."
sleep 3
echo "--------------------------------"
echo "Check: server state: you should read 'OK':"
./wvmgmtd srvlist
echo "Done."
echo "--------------------------------"
echo "Check: active licences (only one here):"
./wvmgmtd licencelistread qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: counters: number of addresses left:"
./wvmgmtd counterinforead qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: Datasets avalaibles:"
./wvmgmtd datalistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Check: "meters" for "licence by click":"
./wvmgmtd meterslistread current qaserver:2021
echo "Done."
echo "--------------------------------"
echo "Removing virtual disk..."
umount_disque_qas
echo "Done."
echo "All done"
echo "Click 'Ctrl-C' to quit."
exit
Когда я запускаю его через SSH, он запускается и в конце я читаю «Все готово». так что это означает, что он достигает последних 2 строк .
Любая идея, как я мог сделать, чтобы закрыть автоматически и пр
bash
ssh
shell-script
Оливье Понс
источник
источник
~/.ssh/config
, попробуйте без него, и передайте параметры-a -x
(и нет-o
), чтобыssh
убедиться, что пересылка не происходит. Если это все еще не работает, покажите содержимое сценария.ssh <yourusername>@localhost '(ls; sleep 10 &); echo Done; jobs'
отобразит список файлов, покажет готово и подождет 10 секунд, прежде чем вернуться.Ответы:
Выход из сценария оболочки не работает, потому что он выходит из сценария, а не из оболочки. Для выхода из оболочки после завершения скрипта выполните
Это запустит скрипт и выйдет из оболочки.
источник
sshd
запущенной оболочкойmyscript.sh
. Написанноеexit
вами будет действовать при выходе из скрипта, что не помогает. Единственное, как может работать ваше решение, - это если сценарий делает что-то странное, когда его родитель является,sshd
и не делает этого странного, когда его родитель - оболочка.~/my_script.sh && exit
выход, как только~/my_script.sh
выходит. Если сценарий оболочки не завершится, ваша команда все равно никогда не доберется доexit
биты. Так что это просто бесполезно.Соединение ssh остается открытым, когда завершается процесс, запущенный ssh (здесь, оболочкой), если есть другие процессы, которые все еще используют его. Я не знаю точных правил, которым следует демон ssh, но соединение используется, по крайней мере, если стандартный вывод любого дочернего процесса все еще подключен к исходному каналу, предоставленному ssh. Для сравнения:
Когда вы запускаете демон, вы должны закрасить его и закрыть его файловые дескрипторы. По крайней мере, используйте это:
Вы можете добавить
nohup
впереди; здесь это не будет иметь значения, но было бы полезно, если бы скрипт запускался из терминала. Многие программы, предназначенные для работы в качестве демонов, имеют параметры командной строки, которые позволяют им переходить в режим форка, закрывать файловые дескрипторы, игнорировать сигналы и другие тонкости. Проверьте вqaswvd
документации, если она есть. Вы также можете исследовать утилиты «daemonizer».источник
Я видел этот пост, когда гуглил для разрешения той же ситуации. Хотя решить проблему @ Оливера уже поздно, поскольку принятый ответ явно не работает ни для ОП, ни для меня (не знаю, почему он принят), я все же хотел бы опубликовать собственное решение для будущего гуглера. Все просто: добавьте
-f
опцию вssh
команду:РЕДАКТИРОВАТЬ
Эффект
-f
опции заключается в том, чтобы поместитьssh
в фоновом режиме, так что без добавления дополнительной опции возможно, что соединение все еще живо, даже если кажется, что оно разорвано. При желании можно обратиться к ответу, приведенному в другом посте на этом сайте.источник
Как и Игнасио, мне любопытно узнать, что в твоем сценарии.
Возможно, вы могли бы попытаться сократить ваш скрипт до наименьшего возможного примера, который приводит к ошибке.
Или начните с пустого сценария и добавляйте команду за раз, пока не увидите проблему, тогда вы будете знать, какая команда вызывает блокировку вашего сценария.
Если пустой скрипт вызывает у вас проблемы, вы можете изучить конфигурацию ssh, например, .bash_logout или некоторые другие, вызываемые при выходе, которые могут вызвать проблему?
источник
Вы можете, вероятно, использовать задания в вашем скрипте. Если это так, оболочка просто ждет, пока ваша работа будет завершена, и не хочет отсоединяться.
Я не собираюсь делать репосты, просто перешлю вам http://en.wikipedia.org/wiki/Nohup#Existing_jobs
источник
nohup
это не проблема напрямую, поскольку на стороне сервера нет терминала: я думаю, что виновником является именно дескриптор открытого файла.Вам нужно будет убить ваш родительский процесс из вашего скрипта.
kill -SIGHUP $PPID
источник
Проблема, скорее всего, в следующей строке.
Эта команда, вероятно, все еще выполняется и будет держать канал ssh открытым до тех пор, пока stdin и stdout & stderr не будут закрыты.
Используйте это вместо:
источник