Intereting Posts
Направьте аудиовыход приложения на несколько устройств воспроизведения Использование файлов / etc / sysconfig / network-scripts / ifcfg-eth * Настройка скрипта в поле AMI для создания каталогов – vsftpd, pam, mysql Зачем мне tty запускать sudo, если я могу sudo без пароля? Доступ к результатам трубы как переменной? smbpasswd сбрасывает пароль, но не истекает срок действия Ошибка RHUI 2.1 Загрузка репо Tails OS: синтаксис сетевой фильтрации, позволяющий I2PBrowser прослушивать на localhost: 6666, затем разрешить пользователю TorBrowser подключаться к нему Аппаратное ускорение на интегрированной графике Intel 5500 и Debian приводит к нестабильной системе Беспроводная связь невероятно медленная на Ubuntu Gnome 17.04 ssh: выполнить команду перед входом в систему Можно ли использовать полный Ubuntu на загрузочном жестком диске? Удаление файлов kdump из / boot Возможность использования DisplayPort через PCIe Разрешения виртуального пользователя vsftpd

su не может открыть ошибку сеанса при запуске базы данных Oracle XE

У меня есть сервер RHEL 7.2 с установленной версией Oracle 11g Express Edition (11.2.0). Установка Oracle создала файл с именем «oracle-xe» в файле /etc/init.d. Это сценарий bash, который можно использовать для запуска и остановки прослушивателя и базы данных вручную. Когда я войду на сервер, я могу запустить следующее:

dzdo /etc/init.d/oracle-xe start 

и база данных Oracle listener + запускается без проблем. Я могу войти в систему, используя sqlplus и выполнить команды. Я пытаюсь использовать chkconfig, чтобы сделать так, чтобы oracle-xe выполнялся автоматически при запуске системы, так что мне не нужно вручную запускать слушатель и базу данных каждый раз, когда сервер перезагружается. Сам сценарий oracle-xe является длительным, но его мясо содержит следующее:

 #!/bin/bash # chkconfig: 2345 80 05 # Source fuction library if [ -f /lib/lsb/init-functions ] then . /lib/lsb/init-functions elif [ -f /etc/init.d/functions ] then . /etc/init.d/functions fi SU=/bin/su ORACLE_OWNER=oracle $ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe LSNR=$ORACLE_HOME/bin/lsnrctl SQLPLUS=$ORACLE_HOME/bin/sqlplus $STARTUP_LOG=/home/tsm/log/oracle-xe.log echo $(date) >> $STARTUP_LOG $SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1 $SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1 

Я добавил код $ STARTUP_LOG и >> перенаправление вывода, чтобы я мог разобраться, что происходит. Я добавил скрипт в chckconfig со следующим:

 cd /etc/init.d dzdo chmod 750 oracle-xe dzdo chkconfig --add oracle-xe dzdo chkconfig oracle-xe on 

Следующая команда дает данный (сокращенный) вывод:

 dzdo chkconfig --list oracle-xe 0:off 1:off 2:on 3:on 4:on 5:on 6:off 

Я перезагружаю сервер и генерирует файл журнала в /home/tsm/log/oracle-xe.log со следующим выходом:

 Fri Jan 13 15:03:58 CST 2017 su: cannot open session: Permission denied su: cannot open session: Permission denied 

и, как вы могли догадаться, в результате этого сбоя не начались ни слушатели, ни механизм базы данных. Поскольку я вижу дату / время перезагрузки в файле журнала, я точно знаю, что скрипт выполняется при загрузке. Мне кажется, что это проблема с разрешениями, что какая-либо учетная запись используется для запуска сценариев инициализации при запуске по какой-либо причине, не может быть su как $ ORACLE_OWNER, но я, как скромный администратор, может сделать это просто из командной строки. Я понял, что код init выполняется как root, поэтому эта команда su должна работать без проблем. Я искал и пробовал разные вещи в течение большей части дня, пытаясь разобраться в этом, и вытащил оставшиеся мои волосы.

Сам сервер использует DirectAuthorize для предоставления прав доступа, поэтому я в конечном итоге использую dzdo вместо sudo. Может ли это иметь к этому какое-то отношение?

Поэтому я понял, что происходит. Когда система использует DirectAuthorize, любая учетная запись, которая хочет su как другой пользователь, должна использовать dzdo . Сюда входит даже учетная запись root, которая используется для запуска любой службы через chkconfig во время загрузки системы. Поэтому я изменил следующие строки в файле сценария oracle-xe:

 $SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1 $SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1 

вместо этого:

 dzdo -s -u $ORACLE_OWNER $LSNR start >> $STARTUP_LOG 2>&1 dzdo -s -u $ORACLE_OWNER $SQLPLUS -s /nolog @ORACLE_HOME/config/scripts/startdb.sql >> @STARTUP_LOG 2>&1 

dzdo не является прямой заменой su , поскольку параметры разные, и вы не можете просто просто отказаться от нее. В частности, нет опции -c для запуска определенной команды с dzdo . Вместо этого команда, которую нужно выполнить, – это все, что появляется в конце инструкции. Переключатель -s указывает на запуск оболочки в качестве целевого пользователя. После внесения этих изменений и перезагрузки слушатель и экземпляр базы данных запускались как пользовательский «оракул» без каких-либо задержек.