在 Nixos 上使用 systemd 计时器运行脚本

Kal*_*ule 5 timer web-scraping systemd nixos

我有一个小的 shell 脚本scrape.sh,可以抓取网站并将结果数据放入新目录中:

\n
website=\'test.com\'\ndir_name="datev_data/$(date -u +\'%Y-%m-%dT%H:%M:%S\')"\nmkdir $dirname\nwget --directory-prefix="$dir_name" "$website"\n
Run Code Online (Sandbox Code Playgroud)\n

(我并不关心数据最终在哪里,只要它每次都会获得一个新目录并且我可以访问数据。因此,我现在将其放入我的主目录中/home/kaligule。)

\n

手动运行这个脚本效果很好,所以现在我想在我的 nixos 服务器上每小时运行这个脚本。因此,我将以下内容放入我的配置中(受这篇文章的启发):

\n
    systemd.services.test_systemd_timers = {\n      serviceConfig.Type = "oneshot";\n      script = \'\'\n        echo "Will start scraping now."\n        {pkgs.bash}/bin/bash /home/kaligule/scrape.sh\n        echo "Done scraping."\n      \'\';\n    };\n\n    systemd.timers.test_systemd_timers = {\n      wantedBy = [ "timers.target" ];\n      partOf = [ "test_systemd_timers.service" ];\n      timerConfig.OnCalendar = [ "*-*-* *:00:00" ];\n    };\n
Run Code Online (Sandbox Code Playgroud)\n

然后我测试一下:

\n
sudo nixos-rebuild switch # everything is fine\nsudo systemctl start test_systemd_timers # run it immediatelly for testing\n
Run Code Online (Sandbox Code Playgroud)\n

我得到:

\n
Job for test_systemd_timers.service failed because the control process exited with error code.\nSee "systemctl status test_systemd_timers.service" and "journalctl -xe" for details.\n
Run Code Online (Sandbox Code Playgroud)\n

第一个建议的命令给了我这个:

\n
\xe2\x97\x8f test_systemd_timers.service\n     Loaded: loaded (/nix/store/f8348svxpnn6qx08adrv5s7ksc2zy1sk-unit-test_systemd_timers.service/test_systemd_timers.service; linked; vendor preset: enabled)\n     Active: failed (Result: exit-code) since Fri 2021-04-02 14:50:02 CEST; 2min 36s ago\nTriggeredBy: \xe2\x97\x8f test_systemd_timers.timer\n    Process: 5686 ExecStart=/nix/store/4smyxxxlhnnmw8l6l3nnfjyvmg0wxcwh-unit-script-test_systemd_timers-start/bin/test_systemd_timers-start (code=exited, status=127)\n   Main PID: 5686 (code=exited, status=127)\n         IP: 0B in, 0B out\n        CPU: 11ms\n\nApr 02 14:50:02 regulus systemd[1]: Starting test_systemd_timers.service...\nApr 02 14:50:02 regulus test_systemd_timers-start[5686]: Will start scraping now.\nApr 02 14:50:02 regulus test_systemd_timers-start[5687]: /nix/store/4smyxxxlhnnmw8l6l3nnfjyvmg0wxcwh-unit-script-test_systemd_timers-start/bin/test_systemd_timers-start: line 3: {pkgs.bash}/bin/bash: No such file or directory\nApr 02 14:50:02 regulus systemd[1]: test_systemd_timers.service: Main process exited, code=exited, status=127/n/a\nApr 02 14:50:02 regulus systemd[1]: test_systemd_timers.service: Failed with result \'exit-code\'.\nApr 02 14:50:02 regulus systemd[1]: Failed to start test_systemd_timers.service.\n
Run Code Online (Sandbox Code Playgroud)\n

第二个建议的命令给了我:

\n
Apr 02 14:54:42 regulus systemd[1]: Starting test_systemd_timers.service...\n\xe2\x96\x91\xe2\x96\x91 Subject: A start job for unit test_systemd_timers.service has begun execution\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 A start job for unit test_systemd_timers.service has begun execution.\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The job identifier is 34454.\nApr 02 14:54:42 regulus test_systemd_timers-start[5734]: Will start scraping now.\nApr 02 14:54:42 regulus test_systemd_timers-start[5735]: /nix/store/4smyxxxlhnnmw8l6l3nnfjyvmg0wxcwh-unit-script-test_systemd_timers-start/bin/test_systemd_timers-start: line 3: {pkgs.bash}/bin/bash: No such file or directory\nApr 02 14:54:42 regulus systemd[1]: test_systemd_timers.service: Main process exited, code=exited, status=127/n/a\n\xe2\x96\x91\xe2\x96\x91 Subject: Unit process exited\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 An ExecStart= process belonging to unit test_systemd_timers.service has exited.\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The process\' exit code is \'exited\' and its exit status is 127.\nApr 02 14:54:42 regulus systemd[1]: test_systemd_timers.service: Failed with result \'exit-code\'.\n\xe2\x96\x91\xe2\x96\x91 Subject: Unit failed\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The unit test_systemd_timers.service has entered the \'failed\' state with result \'exit-code\'.\nApr 02 14:54:42 regulus systemd[1]: Failed to start test_systemd_timers.service.\n\xe2\x96\x91\xe2\x96\x91 Subject: A start job for unit test_systemd_timers.service has failed\n\xe2\x96\x91\xe2\x96\x91 Defined-By: systemd\n\xe2\x96\x91\xe2\x96\x91 Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 A start job for unit test_systemd_timers.service has finished with a failure.\n\xe2\x96\x91\xe2\x96\x91 \n\xe2\x96\x91\xe2\x96\x91 The job identifier is 34454 and the job result is failed.\nApr 02 14:54:42 regulus sudo[5731]: pam_unix(sudo:session): session closed for user root\n
Run Code Online (Sandbox Code Playgroud)\n

因此,因为我Will start scraping now.在日志中收到了该信息,所以我认为该作业已启动但无法运行该脚本。我的问题是:

\n
    \n
  • 我应该将脚本放在哪里(以及具有哪些权限)?
  • \n
  • 我应该如何调整我的配置以便脚本按照我的描述运行?
  • \n
\n

(当然,我很感谢对我的方法的每一个反馈。)

\n

小智 4

你的问题是,在你的脚本中,{pkgs.bash}应该是${pkgs.bash};如果没有$,您将无法获得变量插值。