运行 在 RedHat 上通过 cron 的 dotnet 失败

Running dotnet through cron on RedHat fails

我们有一个用于索引一些文件的 dotnet 核心脚本。我们利用 RedHat Software Collection,因此 dotnet 之类的项目可以与我们的 RHEL 设置相关联。

对于运行脚本,我们执行以下操作: source scl_source enable rh-dotnet30 /opt/rh/rh-dotnet30/root/usr/bin/dotnet /d/h/fileprocessor.dll 1

我们想 运行 在 cron 中执行此操作,但我们无法让它工作。我们尝试了以下方法:

  1. 将 'source' 命令添加到 bash 配置文件,但这对我们来说似乎不可靠,而且在 cron 事件上也不 运行。
  2. 运行 这个直接在cron
  3. 运行 这是 cron
  4. 中的 shell 脚本

我们很茫然,似乎我们永远无法让这两个命令一起工作。如果我们不包含 source 命令,即使在我们的配置文件中,它也不会 运行 并给我们错误“无法找到任何已安装的 .NET Core SDK 您是要 运行 .NET Core SDK 命令吗?从以下位置安装 .NET Core SDK: https://aka.ms/dotnet-download"

以下适合我。不过,我正在使用 rh-dotnet31 (.NET Core 3.1),因为 rh-dotnet30 (.NET Core 3.0) 不受支持:

  1. 安装包:

    $ sudo yum install rh-dotnet31 -y
    
  2. 从已知目录开始

    $ cd ~
    
  3. 为 .NET Core 源代码创建目录

    $ mkdir hello
    $ cd hello
    
  4. 创建一个简单的测试应用程序

    $ scl enable rh-dotnet31 bash
    $ dotnet new console
    $ dotnet publish
    $ exit      # this exits from the subshell started from scl enable command above
    
  5. 将构建复制到我们可以运行的单独目录

    $ cp -a bin/Debug/netcoreapp3.1/publish ../hello-bin
    
  6. 创建 cron 将调用的脚本

    $ cd ~
    

    并将其放入 ./test.sh 文件中:

    #!/bin/bash
    echo "test.sh running now...."
    source scl_source enable rh-dotnet31
    dotnet $HOME/hello-bin/hello.dll 1
    

    您甚至可以将最后两行(source...dotnet ...)组合成 scl enable rh-dotnet31 -- dotnet $HOME/hello-bin/hello.dll 1

    然后使其可执行:

    $ chmod +x ./test.sh
    
  7. 设置 crontab 文件

    $ crontab -e
    

    然后在此文件中添加以下行。这个 运行 每分钟都有一个脚本。

    * * * * *       $HOME/test.sh >> $HOME/test.cron.log 2>&1
    

在我的机器上,cron 是 运行ning,所以我现在在几分钟后在日志文件中看到 cron 作业的输出:

$ tail -f test.cron.log                     
test.sh running now....
Hello World!
test.sh running now....
Hello World!
test.sh running now....
Hello World!
test.sh running now....
Hello World!
test.sh running now....
Hello World!

我们 运行 为此遇到的问题是只安装了运行时,而不是 SDK。一旦安装了包含许多其他依赖项的 SDK,它就可以正常工作了。