Bash 脚本作为 cron 作业 @reboot 运行以设置 Nvidia 设置未设置值?

Bash 脚本作为 cron 作业 @reboot 运行以设置 Nvidia 设置未设置值?

我有一个 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,尤其是在有头系统上。

做一些研究...

相关内容