Detektera Mac Intel/ARM och Rosetta 2 emulator 💻
Hur kan vi detektera vilken processortyp vi kör programmet på och hur kan vi detektera ifall vi befinner oss i emulatorn Rosetta 2.
När jag letade efter en lösning på att köra docker-sync med macOS M1 då såg jag det här GitHub ärendet och började leta efter en lösning.
Hittade ett script som kan detektera processortyp och om vi är i emulatorn Rosetta 2 eller ej.
#!/bin/zsh
arch_name="$(uname -m)"
if [ "${arch_name}" = "x86_64" ]; then
if [ "$(sysctl -in sysctl.proc_translated)" = "1" ]; then
echo "Running on Rosetta 2"
else
echo "Running on native Intel"
fi
elif [ "${arch_name}" = "arm64" ]; then
echo "Running on ARM"
else
echo "Unknown architecture: ${arch_name}"
fi
Jag gjorde en PHP-version av scriptet.
touch cpu
nano cpu - Häll in koden nedan
chmod +x cpu
Nu kan du köra kommandot cpu
.
Har inte kunnat testa i Rosetta 2 men kollat att den returnerar en sträng med ”0” eller ”1”.
När jag körde i Docker Ubuntu fick jag $archName = ’aarch64’.
#!php
<?php
/**
* Return the machine type and if we are in an emulator
* @see https://linuxconfig.org/how-to-read-and-change-the-value-of-kernel-parameters-using-sysctl
* @see https://www.php.net/manual/en/function.php-uname.php
* @return string
*/
function machineType() {
$osFamilyName = strtolower(PHP_OS_FAMILY);
if ($osFamilyName === 'darwin') {
$inEmulator = shell_exec("sysctl -in sysctl.proc_translated");
if ($inEmulator === '1') {
return 'Running on macOS Rosetta 2 emulator emulating Intel';
}
}
$archName = trim(shell_exec('uname -m'));
if ($archName === 'x86_64') {
return 'Running on Intel';
}
if ($archName === 'arm64') {
return "Running on ARM";
}
return "Unknown: $archName";
}
echo machineType();