热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用"export-f<func>"的BASH脚本中的GNUParallel失败,当Crond时出现"CommandNotFound"错误

如何解决《使用"export-f<func>"的BASH脚本中的GNUParallel失败,当Crond时出现"CommandNotFound"错误》经验,为你挑选了1个好方法。

如果我在命令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  /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吗?



1> rici..:

恭喜.你一直都很震惊.

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.该补丁更改了导出函数的格式,结果是:

如果将函数从shell-shellshock bash导出到shell-shellshock bash,则会看到警告,导出的函数将被拒绝.

如果将函数从post-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导出到shell-shellshock bash,并且如上所述,结果是导出被静默忽略.因此错误.

要解决此问题,您需要确保使用bashused来运行命令脚本与bashGNU parallel使用的相同.例如,您可以在调用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


推荐阅读
  • 【场景】:需要定期运行Hadoop的MapReduce【解决办法】:编写一个运行MapReduce的Shell脚本。然后使用crontab配置定时任务。【Shell脚本】 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • 本文详细介绍了如何在 CentOS 7 及其衍生发行版(如 Red Hat, Oracle, Scientific Linux 7)上安装和完全卸载 GitLab。包括安装必要的依赖关系、配置防火墙、安装 GitLab 软件包以及常见问题的解决方法。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
  • 最近,我在CentOS 5服务器上成功部署了GForge 5.7 Community Edition。与Advanced Server版本相比,虽然功能略有简化,但仍然能够满足大多数开源项目管理的需求。为了确保数据安全,我开发了一套全自动备份脚本,该脚本能够定期备份GForge的数据和配置文件,并将其存储在远程服务器上,以防止数据丢失。此外,该脚本还具备错误检测和日志记录功能,便于故障排查和维护。 ... [详细]
  • 服务器上的nginx使用logrotate来分割日志,设置为每天分割。但是logrotate似乎没有工作,日志并没有分割。服务器是CentOS6。为了找到原因 ... [详细]
  • #!binbash########################################################################## File Name : rsync_nobody.sh#  ... [详细]
  • 前言crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较 ... [详细]
  • Linux下怎么使用crontab命令
    本篇内容主要讲解“Linux下怎么使用crontab命令”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Li ... [详细]
  •   crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执 ... [详细]
  • 本文提供了一个使用 while 循环在 Linux Shell 脚本中处理文件列表的具体示例。通过这个例子,读者可以了解如何利用 shell 脚本来批量处理文件,包括文件名的匹配和处理。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 为了确保数据库的高效运行,本文介绍了一种方法,通过编写定时任务脚本来自动清理 `order` 表中状态为 0 或为空的无效订单记录。该脚本使用 PHP 编写,并设置时区为中国标准时间,每 10 分钟执行一次,以保持数据库的整洁和性能优化。此外,还详细介绍了如何配置定时任务以及脚本的具体实现步骤。 ... [详细]
author-avatar
729453686_5be5b9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有