删除 z/OS USS 中的 PDS 成员?
Posted
技术标签:
【中文标题】删除 z/OS USS 中的 PDS 成员?【英文标题】:Delete PDS member in z/OS USS? 【发布时间】:2017-12-21 18:13:05 【问题描述】:有没有一种方法可以删除 z/OS USS 中的 PDS 成员,而无需在整个 PDS 上获得 ENQ?我尝试了“tso delete”,但它抱怨数据集争用。
【问题讨论】:
从 USS 做这件事重要吗?另请注意,ENQ 之类的内容可能取决于您的 GRS 设置。 Kevin McKenzie:是的,我必须从 USS 那里完成。这个想法是 PDS 将镜像 USS 目录的内容。我可以使用 cp 命令复制更改的成员,但我不知道在同一个 exec 中删除 PDS 成员的方法。 您的 GRS RNL 是什么样的? 我们不鼓励在网上发布系统细节,呵呵。您认为从 USS 中删除成员是否取决于 GRS 配置? 可以的。根据 RNL 的设置方式,您可以使用保留/释放而不是 ENQ/DEQ。此外,根据您要执行的操作,您可能会考虑使用 nfs 而不是尝试使 PDS 和 Unix 目录保持同步。 【参考方案1】:一种方法是使用 ISPF 删除服务...它通常将数据集分配为共享,使用它自己的内部 ENQ 来序列化删除。见here。在 UNIX 服务中,您可以创建 USS shell 可以运行的 REXX 脚本,并且它可以调用诸如 ISPEXEC 之类的东西,如您在链接中看到的那样。
您也可以使用 IDCAMS。首先分配 PDS 数据集 - 类似于 alloc fi(pds) dataset(dsn) shr
。然后,带有DELETE 'pds(member)' FILE(pds)
的 IDCAMS 也会做你想做的事。
还有很多其他的方法——关键一般是用 DISP=SHR 分配 PDS,打开 PDS 输出,然后用 DELETE 选项调用 STOW 来删除你想要的成员。
尽管序列化很重要 - 请记住,在共享分配下打开 PDS 以进行输出可能会导致损坏,具体取决于您正在执行的操作。 ISPF 服务使用 ENQ (SPFEDIT) 进行序列化,它为您提供比使用 DISP=OLD 分配更细粒度的序列化...只要数据集被分配,DISP=OLD 就会持续存在,而 SPFEDIT ENQ 仅用于第二次执行删除。
【讨论】:
ADDRESS ISPEXEC 命令在 USS Rexx 中给出 RC -3,表示它不知道寻址环境。即使我使用以下推荐的导出语句也会发生这种情况:ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/… 此外,到目前为止,ALLOC 和 DELETE 的所有排列都失败了。 在 UNIX shell 脚本中使用 ISPEXEC 有一些技巧...首先您需要启动 ISPF 本身(它是运行 ISPSTART 的 ADDRESS TSO),然后运行其余的脚本。一旦你运行了一个 ISPF 实例,ADDRESS ISPEXEC 就可以正常工作了。 您的“alloc”命令也可以使用一些技巧。最大的技巧是您运行 IDCAMS 的部分 - 您需要确保您没有做任何导致 IDCAMS“进程”在不同地址空间中运行的事情,否则,您需要一种方法来确保您的文件分配也发生在那里。阅读 IBM 文档中关于 BPX_SHAREAS 和相关变量的讨论以了解更多信息。以上是关于删除 z/OS USS 中的 PDS 成员?的主要内容,如果未能解决你的问题,请参考以下文章
更改在 z/OS USS 中运行的 REXX exec 中的目录?