Debian

睡在哪裡?

  • July 20, 2022

我在 Jetson Nano 上執行 JetPak 4.6.1,我嘗試執行的PHP 腳本抱怨沒有usleep

sh: 1: usleep: not found

Linux usleep的答案:找不到命令,為什麼?建議它應該在initscripts(在 RH 上)和Debian 顯然是一樣的。但是,initscripts已折舊並由util-linux(或sysvinit-utils)取代。我安裝了util-linux,還是找不到usleep

事實上,查看所有三個包( 和 )的文件列表initscriptsutil-linux沒有sysvinit-utils顯示任何usleep文件。

這個答案Ubuntu 有睡眠嗎?,建議安裝 BusyBox,我這樣做了,但沒有幫助。這個對同一問題的回答可能有一個解決方案(埋在nosql包中),但在嘗試之前,我寧願只知道它應該在哪裡,為什麼這麼難找到?該命令本身是否已被棄用?

PHP 可以更新為sleep使用浮點秒呼叫(GNU 風格);usleep“睡了幾微秒”,一秒鐘內有一百萬個,所以給定一個 $SleepStep100000

$ echo 100000 1000000 / p | dc
.1000

這相當於一個sleep 0.1電話。(GNU sleep,而不是不採用浮點值的其他類型。)

讓自己睡覺

usleep(1)應該不會太難找到原始碼並手動編譯,或者編寫;最棘手的部分是將使用者提供的輸入轉換為 usleep(3)呼叫值,一個希望為正的 32 位整數。

perl -MTime::HiRes=usleep -e 'usleep shift' 100000

但這在我的系統上有大約 30 毫秒的成本,所以理想情況下你會想要一個usleep(1).

非標

usleep(1)否則不是標準的(非linux系統可能沒有它。他們可能沒有 GNU sleep,或者,或者可能改為呼叫它gsleep。)。手冊頁表明usleep是由 RedHat 的一些人撰寫的;RedHat 可能會決定停止支持它,然後誰知道其他各種 Linux 供應商會在那時做什麼。這就是使用 POSIX 指定的工具可以提供幫助的地方。

Shell 腳本中接近零秒的問題

此外,在 shell 腳本中睡眠接近零秒也會成為問題,尤其是在速度較慢、非常繁忙或時間控制不佳的系統(可能是 virts)上。隨著睡眠延遲接近零,fork/exec usleep(或分數sleep呼叫)的成本將主導執行時。usleep(3)在具有或類似系統呼叫的程序中處理短暫的睡眠會好得多。這將比分叉的成本少得多*。*

內部化呼叫

因此,在 PHP 中,人們可能會這樣呼叫usleep

exec ("v4l2-ctl -d {$Device} -c tilt_speed=1");
# TODO check for a v4l2-ctl non-zero exit here
usleep($SleepStep);
exec ("v4l2-ctl -d {$Device} -c tilt_speed=0");

這有兩個system(3)呼叫(PHP 呼叫exec的)而不是一個,但是提高了 sleep 的可移植性。

引用自:https://unix.stackexchange.com/questions/710633