![Bash 脚本作为 cron 作业 @reboot 运行以设置 Nvidia 设置未设置值?](https://linux22.com/image/1153135/Bash%20%E8%84%9A%E6%9C%AC%E4%BD%9C%E4%B8%BA%20cron%20%E4%BD%9C%E4%B8%9A%20%40reboot%20%E8%BF%90%E8%A1%8C%E4%BB%A5%E8%AE%BE%E7%BD%AE%20Nvidia%20%E8%AE%BE%E7%BD%AE%E6%9C%AA%E8%AE%BE%E7%BD%AE%E5%80%BC%EF%BC%9F.png)
我有一个 bash 脚本
#!/bin/bash
# Enable nvidia-smi settings so they are persistent the whole time the system is on.
nvidia-smi -pm 1
# Define the various overclocking settings (powerLimit in watts)
powerLimit="100"
coreOffset="150"
memoryOffset="1000"
targetFanSpeed="40"
TOTAL_GPU=5
GPU_INDEX=0
while [ $GPU_INDEX -lt $TOTAL_GPU ]; do
nvidia-smi -i $GPU_INDEX -pl $powerLimit
nvidia-settings -a [gpu:$GPU_INDEX]/GpuPowerMizerMode=1
nvidia-settings -a [gpu:$GPU_INDEX]/GPUMemoryTransferRateOffset[3]=$memoryOffset
nvidia-settings -a [gpu:$GPU_INDEX]/GPUGraphicsClockOffset[3]=$coreOffset
nvidia-settings -a [gpu:$GPU_INDEX]/GPUFanControlState=1
nvidia-settings -a [fan:$GPU_INDEX]/GPUTargetFanSpeed=$targetFanSpeed
let GPU_INDEX=GPU_INDEX+1
done
要对我系统中安装的 GPU 设置超频。我尝试在启动时运行此脚本,以便在重新启动时自动执行系统。为此,我编辑了我的 root crontab,其中包含以下条目
0 0 * * * reboot -h now
@reboot bash /home/rig0/Documents/startup/1060OC.sh > /home/rig0/Documents/startup/1060OC.log
我将 bash 脚本的输出传输到日志文件中,以确保每个设置都成功。我的第一个小问题是,当我从终端运行 bash 脚本时输出的某些文本没有被捕获到这个文件中
例如,cron 作业的日志输出是(仅针对一个 GPU)
Enabled persistence mode for GPU 00000000:07:00.0.
...
Power limit for GPU 00000000:07:00.0 was set to 100.00 W from 150.00 W.
All done.
但在控制台中运行时,文本显示(仅针对一个 GPU)
Power limit for GPU 00000000:07:00.0 was set to 100.00 W from 100.00 W.
All done.
Attribute 'GPUPowerMizerMode' (rig0-System-Product-Name:0[gpu:4]) assigned
value 1.
Attribute 'GPUMemoryTransferRateOffset' (rig0-System-Product-Name:0[gpu:4])
assigned value 1000.
Attribute 'GPUGraphicsClockOffset' (rig0-System-Product-Name:0[gpu:4])
assigned value 150.
Attribute 'GPUFanControlState' (rig0-System-Product-Name:0[gpu:4]) assigned
value 1.
Attribute 'GPUTargetFanSpeed' (rig0-System-Product-Name:0[fan:4]) assigned
value 40.
为什么当输出通过管道传输到 cron 作业中的日志文件时我看不到“额外”文本?
我想我需要做类似的事情这个 U&L 答案并添加重定向2>&1
。根据之前的阅读,我认为这意味着将命令传输std.err
到管道。std.out
虽然......我认为真正的问题,也是这篇文章的主要问题是,cron job bash 脚本中的任何设置实际上都没有设置(我需要检查,我认为瓦数已经设置了,但我忘记了)。
是否由于 cron 作业在 Nvidia X 服务器启动之前运行,所以这些设置实际上并未设置?
基本上,调用nvidia-settings ...
不会生效,因为nvidia
在运行 cron 作业时使用该驱动程序的 X 服务器尚未运行?
有没有什么方法可以检查并等待 X 服务器在我的 bash 脚本中运行?这将允许 cron 作业等待,直到它尝试实现的设置可用。
也许我可以添加来自这个答案?
编辑:我发现旧 RedHat 档案这给了我一种方法来允许 bash 脚本等待 X 服务器启动
# Wait for the X server to startup
echo "Waiting for the X server to startup..."
XON=""
while [ "$XON" == "" ]; do
/bin/sleep 5
echo " Checking for X server."
XON=$(ps ax | grep -v grep | grep -i xorg)
echo " Result:[$XON]"
done
echo "X server started. Setting overclock settings..."
根据日志文件输出,它似乎等待 X 服务器启动
Waiting for the X server to startup...
Checking for X server.
Result:[ 978 tty7 Rs+ 0:01 /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch]
X server started. Setting overclock settings...
Enabled persistence mode for GPU 00000000:01:00.0.
尽管同样的问题仍然存在。设置没有生效,并且我期望从设置命令获得的输出未出现在日志中。
我是否需要等待nvidia
某事开始..?
编辑2:首先,我将相同的 cron 命令移到我的系统中,rc.local
因为它似乎是一个更正确的解决方案。
接下来,我重定向了输出2>&1
并找到了错误消息
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
ERROR: The control display is undefined; please run `nvidia-settings
--help` for usage information.
这似乎是一个常见的问题在无头系统上尝试运行nvidia-settings
命令,似乎可以通过 解决export DISPLAY:0
。不过,考虑到我有一个有头系统,我不确定这是否是正确的解决方案,或者 的确切效果export DISPLAY:0
,尤其是在有头系统上。
做一些研究...