我在一个npm脚本中有一个命令,它连接到一个远程构建服务器并运行一个Bash脚本。该脚本设置了一个锁文件和一个 trap
调用在脚本退出时删除lockfile。
我正在取消该操作 CTRL + C 在这两种情况下。
LOCKFILEPATH="/tmp/env_app.lock"
# cleanup function just deletes $LOCKFILEPATH
function mutex() {
if [ -f "$LOCKFILEPATH" ]; then
echo -e "\n\n${redtext}Build already in progress! Exiting.${resettext}\n\n";
exit 1;
else
touch $LOCKFILEPATH;
trap cleanup EXIT;
fi
}
当您第一次通过SSH进入主机运行它时,这可以正常工作,但是当您通过SSH发送命令时,陷阱不起作用
ssh hostname command
我尝试添加trap命令来运行更多信号,但这些似乎也不起作用:
trap cleanup EXIT SIGHUP SIGKILL SIGTERM SIGINT
我该怎么办?
我也成立了 更简单的脚本 并且通过SSH手动执行它似乎工作正常。也许当我使用npm脚本运行它时会添加图层? npm脚本是:
"deploy": "ssh HOSTNAME ''deploy-script $(git rev-parse --abbrev-ref HEAD) stage $npm_package_config_deploy_target yes''",
它只检查当前分支名称并使用它在构建主机上进行部署。与...一样
"deploy": "ssh HOSTNAME ''deploy-script CURRENTBRANCH stage APPNAME''",
更新:添加强制tty -t
到npm脚本似乎修复了它。令人困惑,因为我不需要那个简单的脚本案例。也许我在大脚本中产生了太多的子进程(太多而无法在不编辑的情况下粘贴到这里)所以它需要一个tty来触发清理陷阱。
"deploy": "ssh -t HOSTNAME ''deploy-script CURRENTBRANCH stage APPNAME''",
touch
和trap
。常见问题。也, 看看我建议在这个答案中使用的Bash脚本 处理PID锁定逻辑以避免Bash脚本在其自身上运行。