我写了一些 C 代码来打开和关闭一些 LED。实际上,我想根据音乐准确地触发它们,但还没有找到比usleep()
在两者之间使用更好的方法。
无论如何,当我在命令行上调用程序时,打开 LED、等待usleep()
并再次关闭 LED 非常准确。
现在我想让 cron 执行程序,假设每五分钟执行一次。因此,我添加了以下 cronjob crontab -e
:
*/5 * * * * bash ~/startShow.sh >~/log 2>&1
没有shell脚本同样的问题。
*/5 * * * * ~/projects/startLEDShow >~/log 2>&1
启动显示.sh
date
/usr/sbin/i2cset -y 1 0x40 0x00 0x21 # Preparation for communication via I2C
cd projects
./startLEDShow
该程序每五分钟触发一次,但在某个时间点(并不总是同一点),执行似乎停止了一会儿,然后在大约一秒钟后恢复。仅当程序由 cron 运行时,而不是当我从命令行调用它时。
为什么会这样,这可能是由于usleep()
程序中使用的,我怎样才能确保程序执行不会暂停一段时间?
更新 1:这是程序中的 usleep 部分的摘录
// Start reading
while(NULL != (word = readToChar(fp, wordBuffer))) {
// Values for the LEDs are stored in a struct
updateValuesForLEDs(next, word); // Update struct "next"
usleep(((next->time/timeFactor - lastTime)*1000000)); // Wait
lastTime = next->time / timeFactor; // Set lastTime for next iteration
setLEDs(i2cConnection, next, buffer); // Set the LEDs to the brightness values stored in struct "next" via I2C
}
更新 2: 在 ensc 发表评论后,我找到了解决问题的方法。
cronjob 以 10 的 nice 值开始,而大多数其他进程的值围绕 0 圈出。将我的作业设置为较低的 nice 值(需要 root 权限)赋予它更高的优先级并防止它被暂停。
00 20 * * * sudo nice -n -20 ~/projects/startLEDShow >~/log.txt 2>&1