Экранирующие символы в cron - PullRequest
1 голос
/ 15 ноября 2011

У меня есть следующий скрипт (он подключается к базе данных oracle, ищет прикладные arclogs и удаляет его):

ARCLOGS=$(/oracle/base11202/11202/bin/sqlplus -s /  as sysdba <<EOF
set head off
set verify off
set feedback off
select name from v$archived_log where applied = 'YES' and first_time > sysdate - 1 order by sequence#;
exit;
EOF)

echo "${ARCLOGS}" | while read arc
do
  if [[ -e $arc ]] 
  then
    rm -f $arc
  fi
done

Он отлично работает, когда я запускаю его сам.Но идея состоит в том, чтобы начать это с cron.Крон выдает ошибки при попытке запустить этот скрипт:

Your "cron" job executed on test on Mon Nov 14 15:17:00 2011
if [ -e /arclogs/arcs.sh ]; then sh -x /arclogs/arcs.sh; fi 


produced the following output:

+ + /oracle/base11202/bin/sqlplus -s / as sysdba
+ 0<<
set head off
set verify off
set feedback off
select name from v$archived_log where applied = "YES" and first_time > sysdate - 1 order by sequence#;
exit;
ARCLOGS=select name from v$archived_log where applied = "YES" and first_time > sysdate - 1 order by sequence#
                                                *
ERROR at line 1:
ORA-00904: "YES": invalid identifier
+ read arc
+ echo select name from v$archived_log where applied = "YES" and first_time > sysdate - 1 order by sequence#
                                                *
ERROR at line 1:
ORA-00904: "YES": invalid identifier
+ [[ -e select name from v$archived_log where applied = "YES" and first_time > sysdate - 1 order by sequence# ]]
+ read arc
+ [[ -e * ]]
+ read arc
+ [[ -e ERROR at line 1: ]]
+ read arc
+ [[ -e ORA-00904: "YES": invalid identifier ]]
+ read arc

Похоже, проблема с экранированием символов.Но я понятия не имею, что мне нужно бежать.

Кстати, сценарии работают с cron, когда я делю его на две части:

arcs.sh:

ARCLOGS=$(/oracle/base11202/bin/sqlplus -s /  as sysdba <<EOF
set head off
set verify off
set feedback off
select name from v$archived_log where applied = 'YES' and first_time > sysdate - 1 order by sequence#;
exit;
EOF)

echo "${ARCLOGS}" | while read arc
do
  if [[ -e $arc ]] 
  then
    rm -f $arc
  fi
done

и arcs.sql:

connect / as sysdba
set head off
set verify off
set feedback off
select name from v$archived_log where applied = 'YES' and first_time > sysdate - 1 order by sequence#;
exit;

Но я хочу, чтобы он был одним целым.Может кто-нибудь, пожалуйста, помочь?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Просто снимать в темноте. Попробуйте вызвать / bin / bash explicity со своей строки cron. Cron по умолчанию выполняется с sh.

2 голосов
/ 15 ноября 2011

Попробуйте экранировать одинарные кавычки с обратной косой чертой:

select name from v$archived_log where applied = \'YES\' and first_time > sysdate - 1 order by sequence#;

Кавычки явно съедаются оболочкой, и Oracle пытается интерпретировать пустую строку YES как идентификатор, а не строковую константу.

EDIT:

Задание cron выполняется под вашим ID?

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

Попробуйте это:

select name from v$archived_log where applied = "'YES'" and first_time > sysdate - 1 order by sequence#;
...