LINUX.ORG.RU

bash: no job control in this shell

 ,


0

1

Привет!

Проблема такая - необходимо на удаленном хосте выполнить команду по ssh, а точнее запустить один алиас. Любые мои попытки запустить интерактивные шелл на удаленном хосте чтоб подтянуть всякие .bash_profiles и прочие или вызов данных файлов через source с последующим запуском команды через алиас приводят к

bash: cannot set terminal process group (-1): Неприменимый к данному устройству ioctl
bash: no job control in this shell

В случае если команда «простая», например тот же uptime, то результат после этой ругани я таки получаю, а вот запустить какой-нибудь скрипт который стартует с nohup'ом мне уже не удается. Знаю про ключ -tt для ssh, но текущие реалии таковы что коннект происходит через специфическую обертку которая может принимать параметры ssh только те, что можно передать через ключ -o, в котором параметров для выделения tty я не нашел. Можно ли как-то организовать выделение «job control» средствами самого bash или как мне следует поправить скрипт на удаленном хосте чтоб не получать этой ошибки? И, да, переменные окружения из .bash_profiles\.bashrc мне нужно подтянуть, так как выполнение скрипта завязано и на них тоже.

Прошу помощи. Спасибо!!

★★★★★

1) Попробуй 'set -m' (оно же 'set -o monitor').
2) .bash_profiles и .bashrc можно включить и вручную командой '.' (она же 'source').

ABW ★★★★★
()

Проверь наместе ли /proc и /sys на том хосте. Если нет, то:

mount -t proc none /proc
mount -t sysfs none /sys

Еще такая ошибка может быть из-за отсутствия какого-то девайса в /dev (предположительно /dev/console). Так что проверь заодно состав /dev.

UPD Судя по тексту ошибки:

Неприменимый к данному устройству ioctl

можно подумать что устройство либо неправильно создано, либо не создано (man mknod). Есть возможность ребутнуть хост?

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

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от ABW

1) Не помогает, уже пробовал

2) Не работает, делаю ssh user@host 'source ~/.bashrc && alias' и получаю пустоту.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

Да уже второй день гуглю но кроме -tt ничего не нашел. Эта ошибка и на локальном хосте тоже воспроизводится (через ssh конечно), так что с устройствами все ОК.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

А /dev/tty есть на локалхосте? (а на удалённом?)

Сверь, чтоб он был приблизительно таким:

$ stat /dev/tty
  Файл: «/dev/tty»
  Размер: 0             Блоков: 0          Блок В/В: 4096   символьный специальный файл
Устройство: 5h/5d       Inode: 1036        Ссылки: 1     Тип устройства: 5,0
Доступ: (0666/crw-rw-rw-)  Uid: (    0/    root)   Gid: (    5/     tty)
Доступ: 2014-03-28 23:22:56.846129803 +0200
Модифицирован: 2014-03-28 23:22:56.846129803 +0200
Изменён: 2014-03-28 19:17:51.846129803 +0200
 Создан: -

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

Есть и там и там, соответствуют твоему примеру.

alozovskoy ★★★★★
() автор топика
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy

Дело в том, что ssh запускает shell на унаследованном stdin/stdout (который есть сокет), если только не указывать специально -t, поэтому он себя интерактивным не считает, job control отключен, профиль не считывается. ~/ в этом случае и не могла сработать, alias не выполнялся из-за &&, да он и не определён ещё. Кстати, обычно alias-ы определены именно в локальном или общесистемном bash_profile, который всё-таки надо подтягивать вручную. Что говорит 'set -m'?

ABW ★★★★★
()
Ответ на: комментарий от ABW

Не, я понимаю логику почему так происходит, но разве нет способа инициировать запуск job control напрямую на удаленном хосте?

Я вручную подтягиваю нужный мне файл с алиасами по «полному» пути, это не помогает.

Что говорит 'set -m'?

Ничего не говорит как на локальном, так и на удаленном хостах.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

Если на целевой машине есть socat, то можно запустить что-то вроде

socat - EXEC:"/bin/bash -i -c \' set -m ; tty \'",pty,login
или с ptmx вместо pty.

ABW ★★★★★
()
Ответ на: комментарий от IPR

Он практически дефолтный, прописано несколько алиасов, которые подтягиваются через переменные, объявленные в этом хосте (у меня несколько однотипных хостов, но на каждом немного отличается путь к определенному каталогу, на него завязаны alias'ы). На локальной машине вообще profile нет, bashrc - дефолт, переопределены только PS1 и один алиас указан.

alozovskoy ★★★★★
() автор топика

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

ssh user@host 'bash -ilc "command"'

и все работает.

Но таки надеюсь что кто-нибудь расскажет и как эту ошибку убрать.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от IPR

Да вроде как этот job control (хз что это именно такое и как это реализовано) нужен для интерактивной оболочки. В Интернете нашел инфу что вроде как этот job control вообще не отключается, то есть нельзя получить интерактивную оболочку с отсутствующим job control без сабжевой ошибки. Вроде бы и ладно, можно запустить неинтерактивную оболочку и подгрузить нужные файлы, например чрез --rcfile в bash, но во только у меня этот вариант не работает - например я подтягиваю таким образом свой ~/.bash_alias, в выводе alias все ОК, алиасы подтянулись, а вот при попытке вызвать какой-нибудь алиас shell говорит что не знает такой команды.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

Ага, вот как это решается:

bash -O expand_aliases -lc 'someAlias'

В итоге получаем не интерактивную оболочку (то есть ошибок с job control нет) с работающими алиасами.

Соответственно если нужно вместо ~/.bash_profile читать другой файл (если он из ~/.bash_profile не вызывается), его следует передать так:

bash --rcfile ~/.some_file -O expand_aliases -lc 'someAlias'"

P.S. В bashrc нашел вот что:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

так что если вызвать через --rcfile ~/.bashrc он все равно не отработает. Кстати, может кто знает зачем это сделано?

Моя проблема решена.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

.bashrc он все равно не отработает. Кстати, может кто знает зачем это сделано?

потому что в не интерактивном режиме он не должен отрабатывать после этих команд.

emulek
()
Ответ на: комментарий от emulek

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

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

надо его выполнить в неинтерактивном режиме имхо у меня не должно быть с этим проблем

дык и не будет, ставь свои алиасы ДО этого case/esac.

И вообще, спроси у своих маинтейнеров, что они в /etc/skel/ пихают, и захрена так делать? В слаке там только .screenrc.

emulek
()
Ответ на: комментарий от emulek

Ну это понятно. Эта проверка есть в deb-based дистрах (по крайней мере так в моем Debian и еще находил упоминания этого в Ubuntu). Думал может кто знает в чем практический смысл этой проверки.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от alozovskoy

в дебе вообще полно всяких таких костылей. В данном случае действительно есть смысл скажем алиасы добавлять только в интерактивном режиме, ибо в обычном они тупо не работают (по умолчанию), и только время уходит.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.