linux – Jenkins Slave Issue – 无效的流标题:099EACED
撕下:在这部分没有篡改stdin或stdout. #!/bin/bash function set_up { # your set-up code here } function tear_down { # your tear-down code here } function main { # set-up (no stdin,no stdout) set_up "$@" < /dev/null > /dev/null || exit $? # establish Jenkins session java -jar jenkins-cli.jar -blah -blah -blah # tear-down (no stdin,no stdout) tear_down "$@" < /dev/null > /dev/null || exit $? } main "$@" 但为什么? 启动脚本的工作是在主代理和构建代理之间建立一个未被禁止的通信通道(通过stdin和stdout). +------------+ "Hello Agent" | | _ _ ----+ +---- v Hello Agent -> ----+ +---- | | | | "Hello Master" ----+ +---- _ _ <- Hello Master v ----+ +---- | | +------------+ launch script 如果此通信渠道被篡改,Jenkins将无法正常工作. +------------+ "Hello Agent" | | _ _ ----+ +----------- v Hel PLZ SEND HELP!! t -> ----+ +----------- | | | | ----+ +---- | | ^ ----+ +---- | | +------------+ launch script 如果你没有将任何东西输入到该命令中,一些Unix命令可能会“吞下”你的启动脚本的stdin,从而“破坏”通信通道.请考虑以下脚本. #!/bin/bash function keep_stdin_intact { printf 'I do not consume any stdin,' >&2 echo 'and I do not alter the original stdout.' >&2 } function swallow_stdin { echo 'I swallow stdin. Did you see any hexdump below?' >&2 read yn # read consumed some stdin } echo 'yes' | { keep_stdin_intact; cat -; } | xxd echo 'yes' | { swallow_stdin; cat -; } | xxd echo "no you can't now :P" | { swallow_stdin < /dev/null; cat -; } | xxd >第一个是管道输出和十六进制转储,因为keep_stdin_intact没有篡改stdin,在这种情况下,是“是”流. 怎么了ssh? ssh是吞噬你的stdin的邪恶命令之一. 假设您要在运行agent.jar之前删除构建代理上的某些文件.没有样板,你可能会写: ssh $OPTIONS "$remote" 'sudo rm -rf /var/log/nginx/*' ssh $OPTIONS "$remote" 'cd $HOME && java -jar agent.jar' ^但这是错的!第一个ssh命令将吞下你的stdin,Jenkins会话将没有任何东西可读. 第一个ssh必须“沉默”.传递/ dev / null作为其stdin. ssh $OPTIONS "$remote" 'sudo rm -rf /var/log/nginx/*' < /dev/null ssh $OPTIONS "$remote" 'cd $HOME && java -jar agent.jar' (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |