我将代码移至运行 Ubuntu 22 的新虚拟服务器。我的 crontab 中有以下内容(经过编辑以使名称更短),以便仅在尚未运行时才运行myCommand :
*/1 * * * * cusack flock -x -n ~myLock myCommand >> ~my.log 2>&1
当它运行时,它会放入trap: SIGINT: bad trap
我的日志文件中。它没有在旧服务器上执行此操作。难道我做错了什么?
正如上面提到的,我的目标是一次只运行一份 myCommand 副本。如果它仍然从上次开始运行,则它不应该执行任何操作。其他帖子让我相信这是执行此操作的正确方法,并且它在我的旧服务器上有效。那么为什么它会给我这个错误消息呢?
我尝试添加一个“-E 0”,认为 0 可能意味着一切正常,就像在某些情况下一样,但这不起作用。我添加了“-x”,它不起作用,也不应该改变任何东西,因为根据文档它无论如何都是默认值。
根据您在评论中提供的信息,您的旧服务器可能使用旧版本的 Ubuntu 作为
bash
shell/bin/sh
。 Bash 支持像HUP
和 这样的信号名称SIGHUP
作为其内置trap
命令的参数。更新版本的 Ubuntu 使用dash
shell/bin/sh
,Dash 的trap
命令支持信号名称,例如HUP
, 但不支持SIGHUP
。这就是错误消息告诉您的内容。您可以选择以下解决方案:
trap
命令以删除SIG
信号名称中的前缀,使其符合 Dash shell 的语法。bash
(即使其为:)#!/bin/bash
。我的建议是使用第二个选项,因为如果您的脚本的命令/语法中有一种 Bash-ism,那么它可能还有其他选项,并且会出现更多错误和编辑以使其兼容 Dash。相反,一项编辑可确保您继续使用 Bash shell 运行它。