ssh и оболочка через ssh: как выйти?

Я запускаю удаленный сценарий через SSH как это:

ssh user@ipaddress '~/my_script.sh'

Все идет прекрасное, но после того как сценарий закончен, соединение не закрывается. Я должен нажать CTRL-C для повреждения текущего соединения.

Я попробовал команду "выхода" в '~/my_script.sh', и это бесполезно. Я попробовал команду "выхода из системы" в '~/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 строк.

Любая идея, как я мог сделать для закрытия автоматически и PR

22
задан 20.01.2011, 10:37

5 ответов

Выход в сценарии оболочки не работает, потому что он выходит из сценария, не оболочки. Для выхода от оболочки после, сценарий завершается, делают

ssh user@ipaddress '~/my_script.sh && exit'

Это запустит скрипт, затем выходят от оболочки.

19
ответ дан 07.12.2019, 09:56

Как Ignacio, мне любопытно знать то, что находится в Вашем сценарии.

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

Или запустите с пустого сценария и добавьте команду за один раз, пока Вы не будете видеть проблемы, затем Вы будете знать то, что команда заставляет Ваш сценарий запирать.

Если пустой сценарий вызывает Вас проблема, Вы могли бы хотеть исследовать свою ssh конфигурацию, например, .bash_logout или некоторые такой обращенный выход, который может вызвать проблему?

3
ответ дан 07.12.2019, 09:56

Соединение SSH остается открытым когда процесс, запущенный ssh (здесь, оболочка) выходы, если существуют другие процессы, которые все еще используют его. Я не знаю точных правил, что ssh демон следует, но соединение используется, по крайней мере, если стандартный вывод какого-либо дочернего процесса все еще подключен к исходному каналу, обеспеченному ssh. Сравните:

ssh somehost 'sleep 5 &'  # exits after 5 seconds
ssh somehost 'sleep 5 >/dev/null &'  # exits immediately seconds

При запуске демона Вы должны фон это и закрывать его дескрипторы файлов. По крайней мере, используйте это:

./qaswvd </dev/null >/dev/null 2>/dev/null &

Можно хотеть добавить nohup впереди; это не будет иметь значения здесь, но было бы полезно, если скрипт был запущен от терминала. Много программ, которые разработаны для действия как демон, имеют параметры командной строки, чтобы заставить их разветвлять, закрывать дескрипторы файлов, игнорировать сигналы и другие тонкости. Регистрация qaswvd документация, если это имеет тот. Вы могли также исследовать “daemonizer” утилиты.

12
ответ дан 07.12.2019, 09:56

Можно, вероятно, использовать задания в сценарии. Если это так, оболочка просто ожидает Ваших заданий, которые будут закончены, и не хочет отсоединять себя.

Я не собираюсь повторно отправлять, просто передаст Вам http://en.wikipedia.org/wiki/Nohup#Existing_jobs

2
ответ дан 07.12.2019, 09:56

Вы испытываете необходимость для уничтожения родительского процесса из сценария.

kill -SIGHUP $PPID

1
ответ дан 07.12.2019, 09:56

Теги

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