加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

带有“export -f”的BASH脚本中的GNU Parallel在Crond时失败并显

发布时间:2020-12-16 01:33:24 所属栏目:安全 来源:网络整理
导读:如果我在命令 shell上以交互方式运行它,我的脚本会起作用: $cat ndmpcopy_cron_parallel_svlinf05.bash#!/usr/software/bin/bashndmpcopy_cron_parallel() {timestamp=`date +%Y%m%d-%H%M`LOG=/x/eng/itarchives/ndmpcopylogs/05_$1/ndmpcopy_statusTSLOG=$
如果我在命令 shell上以交互方式运行它,我的脚本会起作用:
$cat ndmpcopy_cron_parallel_svlinf05.bash
#!/usr/software/bin/bash

ndmpcopy_cron_parallel() {

timestamp=`date +%Y%m%d-%H%M`
LOG=/x/eng/itarchives/ndmpcopylogs/05_$1/ndmpcopy_status
TSLOG=${LOG}_$timestamp

src_filer='svlinf05'
src_account='ndmp'
src_passwd='src_passwd'
dst_svm='svlinfsrc'
dst_account='vsadmin-backup'
dst_passwd='dst_passwd'

host=`hostname`
echo $host

ssh -l root $src_filer "priv set -q diag ; ndmpcopy -sa $src_account:$src_passwd -da $dst_account:$dst_passwd -i $src_filer.eng.netapp.com:/vol/$1 10.56.10.161:/$dst_svm/$1" | tee -a $TSLOG

echo "ndmpcopy Completed: `date` "

}

export -f ndmpcopy_cron_parallel

/u/jsung/bin/parallel -j 0 --wd . --env ndmpcopy_cron_parallel --eta ndmpcopy_cron_parallel ::: local

但是,脚本失败并抱怨导出的函数ndmpcopy_cron_parallel无法找到:

$crontab -l

40 0,2,4,6,8,10,12,14,16,18,20,22 * * * /u/jsung/bin/ndmpcopy_cron_parallel_svlinf05.bash

错误:

Subject: Cron <jsung@cycrh6svl18> /u/jsung/bin/ndmpcopy_cron_parallel_svlinf05.bash


Computers / CPU cores / Max jobs to run
1:local / 2 / 1

Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
 ETA: 0s Left: 1 AVG: 0.00s  local:1/0/100%/0.0s **/bin/bash: ndmpcopy_cron_parallel: command not found**
 ETA: 0s Left: 0 AVG: 0.00s  local:0/1/100%/0.0s

我一直在寻找并尝试不同的东西.我甚至调整了$PATH.不确定我错过了什么.我们可以在BASH脚本中嵌入GNU Parallel并放入crontab吗?

恭喜.你已经 shell-shocked了.

您的系统上安装了两个版本的bash:

> / bin / bash v4.1.2较旧的未修补的bash
> /usr/software / bin / bash v4.2.53一个中年的bash,对着Shellshock打了补丁

bash版本三元组中的最后一个数字是补丁级别. Shellshock错误涉及许多补丁,但相关的补丁是4.1.14,4.2.50和4.3.27.该补丁更改了导出函数的格式,结果是:

>如果将函数从pre-shellshock bash导出到shellshock bash之后,您将看到一个警告,导出的函数将被拒绝.
>如果将函数从shell-shellshock bash导出到shell-shellshock bash,则无法识别函数导出格式,因此将以静默方式忽略它.

在这两种情况下,都不会导出该功能.换句话说,如果两个bash版本都经过shellshock修补,或者两者都没有经过shellshock修补,那么你只能在两个bash版本之间导出一个函数.

您的脚本清楚地指出了用于运行它的bash:/usr/software / bin / bash中的那个已被修补.该脚本调用GNU parallel,然后GNU parallel必须启动一个或多个子shell才能运行命令. GNU parallel使用SHELL环境变量的值来查找它应该使用的shell.

我想在你的用户命令shell环境中,SHELL设置为/usr/software / bin / bash,而在cron执行的环境中,它被设置为/ bin / bash.如果是这种情况,当您从bash提示符中尝试导出该函数时,您将没有任何问题,但在cron环境中,您最终会尝试将函数从shellshock bash导出到pre-shellshock bash,并且如上所述,结果是导出被静默忽略.因此错误.

要解决此问题,您需要确保使用用于运行命令脚本的bash与GNU parallel使用的bash相同.例如,您可以在调用GNU parallel之前显式设置shell.

export SHELL=/usr/software/bin/bash
# ...
/u/jsung/bin/parallel -j 0 --wd . --env ndmpcopy_cron_parallel --eta ndmpcopy_cron_parallel ::: local

或者您可以为并行命令本身设置它:

SHELL=/usr/software/bin/bash /u/jsung/bin/parallel -j 0 --wd . --env ndmpcopy_cron_parallel --eta ndmpcopy_cron_parallel ::: local

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读