删除 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 中的目录?

从 z/OS UNIX 系统服务 (USS) 文件系统下载二进制文件

适用于 z/OS (USS) 的 JNA 库

REXX:将长字符串写入 pds 成员

无法在 z/OS unix shell 中访问 PDS

只读 DB2 使用来自 REXX 中的 PDS(Dataset) 的成员并存储在 Stem 变量中以供进程相互使用