Как выйти из shell

от admin

Как выйти из shell

Exiting from python Command Line

Usually when you type exit , you would want to exit the program. Why does the interpreter give me the above error when it knows I am trying to exit the command line? Why doesn’t it just exit? I know it doesn’t matter and its a silly question but I am curious.

12 Answers 12

This works for me, best way to come out of python prompt.

In my python interpreter exit is actually a string and not a function — ‘Use Ctrl-D (i.e. EOF) to exit.’ . You can check on your interpreter by entering type(exit)

In active python what is happening is that exit is a function. If you do not call the function it will print out the string representation of the object. This is the default behaviour for any object returned. It’s just that the designers thought people might try to type exit to exit the interpreter, so they made the string representation of the exit function a helpful message. You can check this behaviour by typing str(exit) or even print exit .

When you type exit in the command line, it finds the variable with that name and calls __repr__ (or __str__ ) on it. Usually, you’d get a result like:

But they decided to redefine that function for the exit object to display a helpful message instead. Whether or not that’s a stupid behavior or not, is a subjective question, but one possible reason why it doesn’t «just exit» is:

Suppose you’re looking at some code in a debugger, for instance, and one of the objects references the exit function. When the debugger tries to call __repr__ on that object to display that function to you, the program suddenly stops! That would be really unexpected, and the measures to counter that might complicate things further (for instance, even if you limit that behavior to the command line, what if you try to print some object that have exit as an attribute?)

Unix shell: абсолютно первые шаги

Изначально это была памятка для студентов, которые начинают работать с unix-подобными системами. Иными словами, статья рассчитана на тех, кто не имеет предыдущего опыта работы в unix-овой командной строке, но по тем или иным причинам хочет или должен научиться эффективно с нею взаимодействовать.

Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно.

Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.

Что такое шелл

Shell (шелл, он же «командная строка», он же CLI, он же «консоль», он же «терминал», он же «черное окошко с белыми буковками») — это текстовый интерфейс общения с операционной системой (ну, строго говря, это программа, которая таковой интерфейс обеспечивает, но сейчас это различие несущественно).

В целом работа через шелл выглядит так: пользователь (т.е. вы) с клавиатуры вводит команду, нажимает Enter, система выполняет команду, пишет на экран результат выполнения, и снова ожидает ввода следующей команды.

Типичный вид шелла:
типичный вид шелла

Шелл — это основной способ для взаимодействия со всеми Unix-подобными серверными системами.

Где встречаются системы с командной строкой?

  • MacOS (bash);
  • удаленный доступ на сервер по работе или для личного веб-проекта;
  • домашний файл-сервер с удаленным доступом;
  • Ubuntu, PC-BSD на ноутбуке/десктопе — unix-подобные системы сегодня просты в установке и использовании.

Какие задачи разумно решать шеллом?

  • интерактивная работа в терминале:
    • выполнение компиляции, запуск заданий через make;
    • сравнение текстовых файлов;
    • быстрый ad-hoc анализ данных (количество уникальных ip в логе, распределение записей по часам/минутам и т.п.);
    • разовые массовые действия (прибить много процессов; если работаете с системой контроля версий — ревертнуть или зарезолвить кучу файлов);
    • диагностика происходящего в системе (семафоры, локи, процессы, дескрипторы, место на диске и т.п.);
    • установочные скрипты, для выполнения которых нельзя рассчитывать на наличие других интерпретаторов — это не для новичков;
    • функции для кастомизации интерактивного шелла (влияющие на приглашение, меняющие каталог, устанавливающие переменные окружения) — тоже не совсем для новичков;
    • одноразовые скрипты типа массового перекодирования файлов;
    • makefile-ы.

    Абсолютно первые шаги

    Начинаем работу: войти и выйти

    Убедитесь, что точно знаете, как запустить шелл и как из него выйти.

    Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.

    На MacOS — тоже запустить Terminal.

    Для доступа к удаленному серверу — воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).

    Кто я, где я?

    • hostname — выводит имя машины (сервера), на которой вы сейчас находитесь;
    • whoami — выводит ваш логин (ваше имя в системе);
    • tree -d / |less — псевдографическое изображение дерева каталогов на машине; выход из пролистывания — q ;
    • pwd — выводит каталог, в котором вы сейчас находитесь; в командной строке вы не можете быть «просто так», вы обязательно находитесь в каком-то каталоге (=текущий каталог, рабочий каталог). Вероятно, текущий рабочий каталог выводится у вас в приглашении (prompt).
    • ls — список файлов в текущем каталоге; ls /home — список файлов в указанном каталоге;

    История команд (history)

    Важное свойство полноценной командной строки — история команд.

    Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter — команда выполнится еще раз.

    Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после — нет). Нажмите Enter — выполнится модифицированная команда.

    Пролистывание истории, редактирование и повторное выполнение команд — самые типичные действия при работе в командной строке, привыкайте.

    Copy-paste

    Командная строка очень текстоцентрична: команды — это текст, входные данные для большинства стандартных программ — текст, результат работы — чаще всего тоже текст.

    Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки.

    Попробуйте выполнить команду date +»%y-%m-%d, %A»
    Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.

    После того, как научитесь пользоваться man ‘ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).

    Как именно копировать текст из терминала и вставлять его в терминал — зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование — просто выделение мышью, вставка — средняя кнопка мыши. Если не работает, или если у вас другая система — поищите в Интернете или спросите более опытных знакомых.

    Ключи и опции

    При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:

    Если же добавить ключ -l , к каждому файлу выводится подробная информация:

    Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f .

    Кроме того, команды могут принимать в качестве параметров имена файлов, каталогов или просто текстовые строки. Попробуйте:

    man — справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.

    Попробуйте: man grep , man atoi , man chdir , man man .

    Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки — кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям — клавиша n .

    • 1 — исполняемые программы и шелльные команды ( wc , ls , pwd и т.п.);
    • 2 — системные вызовы ( fork , dup2 и т.п.)
    • 3 — библиотечные функции ( printf , scanf , cos , exec ).

    Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка — тоже часть комады).

    Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель — less , и именно он обеспечивает вам пролистывание, когда вы читаете man-ы.

    Попробуйте и сравните поведение:

    Можно передать файл в пролистыватель сразу в параметрах:

    Пролистывание вверхи и вниз — кнопки «вверх», «вниз», «PageUp», «PageDown», выход — кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям — клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .)

    Права

    С любым файлом или каталогом связан набор «прав»: право на чтение файла, право на запись в файл, право исполнять файл. Все пользователи делятся на три категории: владелец файла, группа владельца файла, все прочие пользователи.

    Посмотреть права на файл можно с помощью ls -l . Например:

    Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) — только читать, всем прочим пользователя — тоже только читать.

    Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать.

    Подробнее читайте в man chmod .

    STDIN, STDOUT, конвейеры (пайпы)

    С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN , поток выходных данных STDOUT , поток для вывода ошибок STDERR .

    Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:

    В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.

    Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так:

    В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.

    Можно представить себе так: программа — это труба, в которую втекает STDIN , а вытекает STDOUT .

    Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход ( STDOUT ) одной программы передавать в качестве входных данных ( STDIN ) другой программе.

    Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски — конвейер или пайп.

    Объединение программ в конвейер делается символом | (вертикальная черта)

    Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее:

    Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.

    В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc :

    Составление конвейеров (пайпов) — очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».

    Перенаправление ввода-вывода

    Вывод ( STDOUT ) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):

    В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt

    Если файл с таким именем уже существовал, его старое содержимое будет уничтожено. Если файл не существовал, он будет создан. Каталог, в котором создается файл, должен существовать до выполнения команды.

    Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> :

    Проверьте, что теперь записано в файле.

    Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:

    Что делать, когда что-то непонятно

    Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):

    • насколько возможно четко сформулируйте вопрос или задачу — нет ничего сложнее, чем решать «то, не знаю что»;
    • вспомните, сталкивались ли вы уже с такой же или подобной проблемой — в этом случае стоит попробовать решение, которое сработало в прошлый раз;
    • почитайте подходящие man-ы (если понимаете, какие man-ы подходят в вашем случае) — возможно, вы найдете подходящие примеры использования команд, нужные опции или ссылки на другие команды;
    • подумайте: нельзя ли немного поменять задачу? — возможно, чуть-чуть изменив условия, вы получите задачу, которую уже умеете решать;
    • задайте свой четко сформулированный вопрос в поисковой системе — возможно, ответ найдется на Stack Overflow или других сайтах;

    Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) — запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях.

    Методы работы

    Скопировать-и-вставить — из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.

    Читать man. Nuff said.

    Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить.См. также раздел «Составление конвейера-однострочника».

    Базовые команды

    • переход в другой каталог: cd ;
    • просмотр содержимого файлов: саt , less , head , tail ;
    • манипуляции с файлами: cp , mv , rm ;
    • просмотр содержимого каталогов: ls , ls -l , ls -lS ;
    • структура каталогов: tree , tree -d (можно передать в качестве параметра каталог);
    • поиск файлов: find . -name . ;

    Аналитика

    • wc , wc -l ;
    • sort -k — сортировка по указанному полю;
    • sort -n — числовая соритровка;
    • diff — сравнение файлов;
    • grep , grep -v , grep -w , grep ‘\<word\>’ , grep -E — поиск текста;
    • uniq , uniq -c — уникализация строк;
    • awk — в варианте awk ‘‘ , чтобы оставить только первое поле из каждой строки, $1 можно менять на $2 , $3 и т.д.;

    Диагностика системы

    • ps axuww — информация о процессах (запущенных программах), работающих на машине;
    • top — интерактивный просмотр самых ресурсоемких процессов;
    • df — занятое и свободное место на диске;
    • du — суммарный размер файлов в каталоге (рекурсивно с подкаталогами);
    • strace , ktrace — какие системные вызовы выполняет процесс;
    • lsof — какие файлы использует процесс;
    • netstat -na , netstat -nap — какие порты и сокеты открыты в системе.

    Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям ( root ‘у).

    Массовое и полуавтоматическое выполнение

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

    • test — проврека условий;
    • while read — цикл по строчкам STDIN ;
    • xargs — подстановка строк из STDIN в параметры указанной программе;
    • seq — генерация последовательностей натуральных чисел;
    • () — объединить вывод нескольких команд;
    • ; — выполнить одно за другим;
    • && — выполнить при условии успешного завершения первой команды;
    • || — выполнить при условии неудачного завершения первой команды;
    • tee — продублировать вывод программы в STDOUT и в файл на диске.

    Разное

    • date — текущая дата;
    • curl — скачивает документ по указаному url и пишет результат на STDOUT ;
    • touch — обновить дату модификации файла;
    • kill — послать процессу сигнал;
    • true — ничего не делает, возвращает истину, полезна для организации вечных циклов;
    • sudo — выполнить команду от имени root ‘а.

    Составление конвейера-однострочника

    Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server , запущенные от имени текущего пользователя.

    Шаг 1.
    Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе: ps axuww . Запустить.

    Шаг 2.
    Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.

    — только процессы текущего пользователя.

    Шаг 3.
    Повторять пункт 2, пока не получатся чистые нужные данные.

    — все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),

    — только процессы с нужным именем

    — pid-ы нужных процессов, п. 3 выполнен

    Шаг 4.
    Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:

    • |wc -l чтобы посчитать количество процессов;
    • >pids чтобы записать pid-ы в файл;
    • |xargs kill -9 убить процессы.

    Задания для тренировки

    Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:

    • получите список всех файлов и каталогов в вашем домашнем каталоге;
    • получите список всех man -статей из категории 2 (системные вызовы);
    • посчитайте, сколько раз в man-е по программе grep встречается слово grep;
    • посчитайте, сколько процессов запущено в данный момент от имени пользователя root ;
    • найдите, какая команда встречается в максимальном количестве категорий справки (man);
    • подсчитайте, сколько раз встречается слово var на странице ya.ru.

    Что изучать дальше?

    Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.

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

    • awk
    • sed
    • find со сложными опциями
    • apropos
    • locate
    • telnet
    • netcat
    • tcpdump
    • rsync
    • screen
    • ssh
    • tar
    • zgrep , zless
    • visudo
    • crontab -e
    • sendmail

    Кому это надо?

    А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.

    Data Scientist, Economic Research: Comfort with the command line and with Unix core tools; preferred: adeptness with a scripting language such as Python, or previous software engineering experience.

    MySQL Database Engineer: High degree of proficiency in Shell scripting (Bash, Awk, etc); high degree of proficiency in Linux administration.

    Manufacturing Quality Engineer, Server: Scripting skills in Bash, Perl, or Python is desirable.

    Data Platform Engineer: 2 years experience with Unix/Linux systems.

    DevOps Engineer, Data: 2 years experience with Unix/Linux system administration and programming.

    Вопросы?

    Если у вас есть вопросы по этой статье или вообще по работе в юниксовой командной строке, задавайте их в комментариях или по емейлу liruoko (at) yandex (dot) ru .

    Any way to exit bash script, but not quitting the terminal

    When I use exit command in a shell script, the script will terminate the terminal (the prompt). Is there any way to terminate a script and then staying in the terminal?

    My script run.sh is expected to execute by directly being sourced, or sourced from another script.

    EDIT: To be more specific, there are two scripts run2.sh as

    when I run it by . run2.sh , and if it hit exit codeline in run.sh , I want it to stop to the terminal and stay there. But using exit , the whole terminal gets closed.

    PS: I have tried to use return , but echo codeline will still gets executed.

    17 Answers 17

    The «problem» really is that you’re sourcing and not executing the script. When you source a file, its contents will be executed in the current shell, instead of spawning a subshell. So everything, including exit, will affect the current shell.

    Instead of using exit , you will want to use return .

    Yes; you can use return instead of exit . Its main purpose is to return from a shell function, but if you use it within a source -d script, it returns from that script.

    Cause a shell function to exit with the return value n. If n is not supplied, the return value is the exit status of the last command executed in the function. This may also be used to terminate execution of a script being executed with the . (or source ) builtin, returning either n or the exit status of the last command executed within the script as the exit status of the script. Any command associated with the RETURN trap is executed before execution resumes after the function or script. The return status is non-zero if return is used outside a function and not during the execution of a script by . or source .

    You can add an extra exit command after the return statement/command so that it works for both, executing the script from the command line and sourcing from the terminal.

    Example exit code in the script:

    The line with the exit command will not be called when you source the script after the return command.

    When you execute the script, return command gives an error. So, we suppress the error message by forwarding it to /dev/null .

    David Kariuki's user avatar

    Instead of running the script using . run2.sh , you can run it using sh run2.sh or bash run2.sh

    A new sub-shell will be started, to run the script then, it will be closed at the end of the script leaving the other shell opened.

    David Kariuki's user avatar

    Actually, I think you might be confused by how you should run a script .

    If you use sh to run a script, say, sh ./run2.sh , even if the embedded script ends with exit , your terminal window will still remain.

    However if you use . or source , your terminal window will exit/close as well when subscript ends.

    Ashley Frieze's user avatar

    This is just like you put a run function inside your script run2.sh. You use exit code inside run while source your run2.sh file in the bash tty. If the give the run function its power to exit your script and give the run2.sh its power to exit the terminator. Then of cuz the run function has power to exit your teminator.

    Anyway, I approve with Kaz it’s a design problem.

    I had the same problem and from the answers above and from what I understood what worked for me ultimately was:

    Have a shebang line that invokes the intended script, for example,

    #!/bin/bash uses bash to execute the script

    I have scripts with both kinds of shebang’s. Because of this, using sh or . was not reliable, as it lead to a mis-execution (like when the script bails out having run incompletely)

    The answer therefore, was

      • Make sure the script has a shebang, so that there is no doubt about its intended handler.
      • chmod the .sh file so that it can be executed. (chmod +x file.sh)

    Invoke it directly without any sh or .

    Hope this helps someone with similar question or problem.

    David Kariuki's user avatar

    gk_2000's user avatar

    To write a script that is secure to be run as either a shell script or sourced as an rc file, the script can check and compare $0 and $BASH_SOURCE and determine if exit can be safely used.

    Here is a short code snippet for that

    David Kariuki's user avatar

    I think that this happens because you are running it on source mode with the dot

    You should run that in a subshell:

    JBoy's user avatar

    It’s correct that sourced vs. executed scripts use return vs. exit to keep the same session open, as others have noted.

    Here’s a related tip, if you ever want a script that should keep the session open, regardless of whether or not it’s sourced.

    The following example can be run directly like foo.sh or sourced like . foo.sh / source foo.sh . Either way it will keep the session open after «exiting». The $@ string is passed so that the function has access to the outer script’s arguments.

    $ foo.sh
    $ Would you like to XYZ? (Y/N): n
    $ . foo.sh
    $ Would you like to XYZ? (Y/N): n
    $ |
    (terminal window stays open and accepts additional input)

    This can be useful for quickly testing script changes in a single terminal while keeping a bunch of scrap code underneath the main exit / return while you work. It could also make code more portable in a sense (if you have tons of scripts that may or may not be called in different ways), though it’s much less clunky to just use return and exit where appropriate.

    ssh и shell через ssh: как выйти?

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

    Я пробовал команду «exit» в «

    /my_script.sh», и она бесполезна. Я попробовал команду «logout» в

    /my_script.sh и получаю сообщение:

    Любая идея, как я мог бы сделать, чтобы автоматически и правильно закрыть SSH, когда сценарий будет завершен?

    (Модификация для уточнения 🙂 Вот что внутри моего скрипта:

    Когда я запускаю его через SSH, он запускается и в конце я читаю «Все готово». так что это означает, что он достигает последних 2 строк.

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

    7 ответов 7

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

    Это запустит скрипт и выйдет из оболочки.

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

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

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

    Я видел этот пост, когда гуглил для разрешения той же ситуации. Хотя решить проблему @ Оливера уже поздно, поскольку принятый ответ явно не работает ни для ОП, ни для меня (не знаю, почему он принят), я все же хотел бы опубликовать собственное решение для будущего гуглера. Все просто: добавьте опцию -f в команду ssh :

    РЕДАКТИРОВАТЬ

    Эффект опции -f — установить ssh в фоновом режиме, поэтому без добавления каких-либо дополнительных опций возможно, что соединение все еще живо, даже если кажется, что оно разорвано. При желании можно обратиться к ответу, приведенному в другом посте на этом сайте.

    Читать:
    Как посмотреть версию программы

Похожие статьи