Я пытаюсь создать туннель 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 к другой машине с моего терминала.