Назад | Перейти на главную страницу

Как заставить ssh работать в фоновом режиме без использования -f?

Я пытаюсь создать туннель ssh, перевести его в фоновый процесс и написать файл pid, который я позже могу использовать, чтобы убить его. Я МОГУ запустить ssh с -f, но тогда у меня нет дескриптора его PID.

Однако, когда я пытаюсь запустить приведенный ниже сценарий через nohup или setsid, управление никогда не возвращается оболочке, из которой я пытаюсь демонизировать сценарий.

#!/bin/sh                                                 

while getopts ":v" flag; do
    case $flag in
        v|verbose) verbose=1;;
        :) echo "option -$lastflag requires an argument"; exit 1;;
    esac 
    lastflag="$flag"
    shift $((OPTIND - 1)); OPTIND=1
done

ssh  -p '2222'  -nNL '5984:localhost:5984' 'blah@foo.com' &
pid=$!
sleep 2;
ps -p $pid >/dev/null 2>&1 || exit 1
echo $pid > "var/couchdb-tunnel.pid"
wait

Призыв:

nohup script.sh
setsid script.sh

Как мне убедить ssh (я полагаю) отказаться от терминала? Есть ли другой способ добиться того, чего я хочу?

Встроенная оболочка, которую вы ищете, это disown, которые возвращают родителей на работу в init чтобы сценарий мог выйти, оставив их в фоновом режиме. Вероятно, вы захотите перенаправить вывод на /dev/null (или файл журнала), чтобы избежать вывода в оболочке после запуска скрипта.

ssh hostname 'command' &>/dev/null &
disown

Разве это не wait заставляя ваш скрипт ждать? На странице руководства ...

wait [n ...] Ждать каждого указанного процесса и возвращать его статус завершения. Каждый n может быть идентификатором процесса или спецификацией задания; если задана спецификация задания, ожидаются все процессы в конвейере этого задания. Если n не указано, ожидаются все активные в данный момент дочерние процессы, и статус возврата равен нулю. Если n указывает на несуществующий процесс или задание, статус возврата - 127. В противном случае статус возврата - это статус выхода последнего ожидаемого процесса или задания.

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

я использую screen чтобы в одном окне терминала работали разные соединения и скрипты. Это также позволяет мне выключить машину, пойти домой, снова включить ее и перезагрузить screen сеанс Я хотел следить за тем, что происходит.

Конечно, это при условии, что я подключился по SSH к другой машине с моего терминала.