在这个问题中提出了使用 crontab 在两台机器上调度 netcat 命令的想法,但受访者都指责提问者并scp
转而谈论。
假设我对这些影响没问题,我将如何找出这个设置出了什么问题?出于测试目的,我在当地时间 13:45 同步这两个作业。两台计算机位于同一本地时区。
目标 crontab:
45 13 * * * nc -l -p 1234 > /path/to/backup-$(date +%F).tar.bz2
源 crontab:
45 13 * * * /path/to/backup_script.sh
源备份脚本:
sleep 5 # to ensure the destination is already listening
tar -cvpj --exclude-vcs /path/to/source/files | nc -N dest 1234
单独(在 crontab 之外),listen 命令和备份脚本工作。据我了解,目的地在收到 EOF 之前不会停止收听。然而,它的收听端似乎没有在应该收听的时候收听。我可以手动启动它,源的计划作业将发送文件,但我无法让目标在指定的时间收听。
crontab
命令 (man -a crontab
) 不是bash
。重定向和命令替换在命令中不可用crontab
。将所需的命令包装在一个
bash
脚本中,以 开头,然后从条目中#!/bin/bash
调用该脚本。crontab
如 中
man 5 crontab
所述,该%
字符在 crontab 中是特殊的,必须转义所以你的命令需要写成
否则,
%
将被视为行尾字符,传递给 shell 的命令会被截断,nc -l -p 1234 > /path/to/backup-$(date +
这显然是语法错误。注意:由于问题是“如何调试”,您可以通过查看 cron 服务 ex 的日志条目来诊断。
你会注意到被截断的命令。
尽管 crontab 文件本身不是 shell 脚本,但每个 crontab 条目的命令部分都会传递给 shell。再次来自
man 5 crontab
:因为默认是
/bin/sh
,它将接受任何 POSIX shell 功能,包括重定向<
>
>>
,以及$(...)
命令替换构造。&>
除非您进行SHELL
适当的更改,否则它将因特定于 bash 的重定向而失败。因此,虽然将您的命令移动到单独的 shell 脚本中可以解决故障,但这仅仅是因为它将%
字符移动到了 crontab 之外。