AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1295549
Accepted
kjekk
kjekk
Asked: 2020-11-27 14:03:50 +0800 CST2020-11-27 14:03:50 +0800 CST 2020-11-27 14:03:50 +0800 CST

如何调试涉及 netcat 的失败 cron 作业?

  • 772

在这个问题中提出了使用 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 之前不会停止收听。然而,它的收听端似乎没有在应该收听的时候收听。我可以手动启动它,源的计划作业将发送文件,但我无法让目标在指定的时间收听。

scripts cron tar netcat
  • 2 2 个回答
  • 327 Views

2 个回答

  • Voted
  1. Best Answer
    waltinator
    2020-11-27T14:37:46+08:002020-11-27T14:37:46+08:00

    crontab命令 ( man -a crontab) 不是bash。重定向和命令替换在命令中不可用crontab。

    将所需的命令包装在一个bash脚本中,以 开头,然后从条目中#!/bin/bash调用该脚本。crontab

    • 0
  2. steeldriver
    2020-11-28T05:54:41+08:002020-11-28T05:54:41+08:00

    如 中man 5 crontab所述,该%字符在 crontab 中是特殊的,必须转义

                                             Percent-signs (%) in the command,
       unless escaped with backslash (\), will be changed into newline charac‐
       ters,  and  all  data  after the first % will be sent to the command as
       standard input. There is no way to split a  single  command  line  onto
       multiple lines, like the shell's trailing "\".
    

    所以你的命令需要写成

    45 13 * * * nc -l -p 1234 > /path/to/backup-$(date +\%F).tar.bz2
    

    否则,%将被视为行尾字符,传递给 shell 的命令会被截断,nc -l -p 1234 > /path/to/backup-$(date +这显然是语法错误。


    注意:由于问题是“如何调试”,您可以通过查看 cron 服务 ex 的日志条目来诊断。

    journalctl -xeu cron | grep CMD
    

    你会注意到被截断的命令。


    尽管 crontab 文件本身不是 shell 脚本,但每个 crontab 条目的命令部分都会传递给 shell。再次来自man 5 crontab:

       The  entire  command  portion  of the line, up to a newline or %
       character, will be executed by /bin/sh or by the shell specified in the
       SHELL  variable of the crontab file.  
    

    因为默认是/bin/sh,它将接受任何 POSIX shell 功能,包括重定向< > >>,以及$(...)命令替换构造。&>除非您进行SHELL适当的更改,否则它将因特定于 bash 的重定向而失败。因此,虽然将您的命令移动到单独的 shell 脚本中可以解决故障,但这仅仅是因为它将%字符移动到了 crontab 之外。

    • 0

相关问题

  • 如何每 5 秒运行一次脚本?

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 如何使 cron 电子邮件成为我的 @gmail 帐户

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve