Nix 内置命令/命令(echo、ps、sort、uniq)从 Debian 到其他发行版的可靠性/可移植性如何

Nix 内置命令/命令(echo、ps、sort、uniq)从 Debian 到其他发行版的可靠性/可移植性如何

我已经编写了一个脚本,并且想知道它的可靠性/可移植性。

#!/bin/bash
threadsPlease() {
  ps -mo lwp,c -p $1 | sort -gk 2 | uniq -f 1 
}

THREAD_LINE=$( threadsPlease $1 | grep -v - | tail -1)

THREAD10=$(echo $THREAD_LINE | awk '{print $1}')
THREAD16=$(printf '%x\n' $THREAD10)

JAVA_LINE=$(jstack $1 | grep $THREAD16)
echo "OS data (thread, CPU usage %): " $THREAD_LINE
echo "Java thread: " $JAVA_LINE

脚本在给定 Java PID 的情况下显示系统和 Java 线程数据。示例执行:

./whichThreadIsIt.sh 6814
OS data (thread, CPU usage %):  6838 3
Java thread:  "AWT-EventQueue-0" #19 prio=6 os_prio=0 tid=0x00007f50f4090800 nid=0x1ab6 waiting on condition [0x00007f510dfbb000]

Q1:除了明显的(“jstack/java/awk/...不可用或不在路径中”或“错误给出的输入数据”)之外,什么时候这不能按预期方式工作(Ubuntu/Debian)?

问题 2:“移植 shell 比移植 shell 脚本更容易”,我的朋友喜欢这么说。那么,要在 Fedora / CentOS、Free BSD 和 Solaris 中实现这一点还需要付出多少努力呢?我期望它能够顺利运行(假设这些盒子上存在 Bash)是错误的吗?

答案1

#!/usr/bin/env bash

可能会也可能不会增加可移植性,就好像bash实际安装在 *BSD 系统上一样,它通常存在于/usr/local/bin/bash.然而,env可能不可移植,尽管这只适用于非常古老或奇怪的 UNIX 系统。

ps是一个特别不可移植的命令,特别是如果您打算在 SysV 系统(例如 Solaris)上使用 BSD/GNUisms。一种解决方案是在某处安装 GNU 工具,然后修复 PATH 以包含这些工具。

相关内容