[20221104]bash exec使用技巧.txt

[20221104]bash exec使用技巧.txt

--//前几天遇到mail问题,看到别人的使用技巧.利用exec 重定向输出到文本文件.原始例子:

# crontab -u oracle -l
5 23 * * * /home/del_log/del_arc.sh

# cat /home/del_log/del_arc.sh
source ~/.bash_profile
exec >> /home/del_log/log/del_arch`date +%F-%H`.log
/u01/app/oracle/product/19/db_1/bin/rman target / <delete noprompt archivelog until time 'sysdate-10';
exit;
EOF

--//这样执行时rman的输出全部定向到/home/del_log/log/del_arch`date +%F-%H`.log文件.
--//以前我写crontab文件都是如下:

# cat /etc/cron.d/ntp
*/20 * * * * root /usr/sbin/ntpdate 192.168.XXX.XX > /dev/null 2>&1

--//不过这样给调试带来麻烦,必须在结束后修改回来.
--//如果在bash shell调试时执行如下:
$ echo $BASHPID
10673

$ ls -l /proc/$BASHPID/fd
total 0
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 0 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 1 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:35:23 2 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 255 -> /dev/pts/2

$ source /home/del_log/del_arc.sh
$ cat /home/del_log/del_arc.sh
--//没有显示.因为这时文件描述符1被重新定义到/home/del_log/log/del_arch`date +%F-%H`.log.

--//打开另外的会话执行:
$ ls -l /proc/10673/fd
total 0
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 0 -> /dev/pts/2
l-wx------. 1 oracle oinstall 64 2022-11-09 00:41:50 1 -> /home/del_log/log/del_arch2022-11-09-08.log
lrwx------. 1 oracle oinstall 64 2022-11-09 00:35:23 2 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 255 -> /dev/pts/2

--//在结尾加入:
$ exec 1 > $(tty)
-bash: /dev/pts/2: Permission denied
-bash: printf: write error: Bad file descriptor

# ls -l /dev/pts/2
crw--w----. 1 root tty 136, 2 2022-11-09 08:54:11 /dev/pts/2
--//oracle用户没有权限.可以写成如下:

$ exec 1>&2

$ ls -l /proc/10673/fd
total 0
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 0 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 1 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:35:23 2 -> /dev/pts/2
lrwx------. 1 oracle oinstall 64 2022-11-09 00:41:50 255 -> /dev/pts/2

--//这样才能保证测试完成后,其它命令执行显示正常.
--//脚本最后修改如下:

$ cat /home/del_log/del_arc.sh
#! /bin/bash
#source ~/.bash_profile

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19/db_1
export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin:/u01/ogg122
export ORACLE_SID=orcl
export NLS_LANG=AMERICAN_AMERICA.zhs16gbk
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LD_LIBRARY_PATH
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'
export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'

exec >> /home/del_log/log/del_arch`date +%F-%H`.log
/u01/app/oracle/product/19/db_1/bin/rman target / <delete noprompt archivelog until time 'sysdate-10';
exit;
EOF
exec 1>&2

--//或者定义一个变量
#! /bin/bash
#source ~/.bash_profile

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19/db_1
export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin:/u01/ogg122
export ORACLE_SID=orcl
export NLS_LANG=AMERICAN_AMERICA.zhs16gbk
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LD_LIBRARY_PATH
export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
export NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'
export NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF'

# exec >> /home/del_log/log/del_arch`date +%F-%H`.log
logfile=/home/del_log/log/del_arch`date +%F-%H`.log
/u01/app/oracle/product/19/db_1/bin/rman target / log=$logfile append <delete noprompt archivelog until time 'sysdate-10';
exit;
EOF
# exec 1>&2

--//修改crontab如下:
# crontab -u oracle -l
5 23 * * * /home/del_log/del_arc.sh > /dev/null 2>&1

--//在我看来对方连基本的测试都没有做,不然不会存在这么多错误.
--//我百度 检索 /home/del_log/del_arc.sh,找到一些链接,肯定对方的测试不严谨...其它人仅仅像做作业一样照抄无误.
--//连错误都是一样的.链接如下:
--//https://blog.csdn.net/mgxiaomage/article/details/73863375


请使用浏览器的分享功能分享到微信等