표적:sudo를 사용하여 문자열을 찾을 때까지 로그 뒤에 오는 cmd 줄을 실행한 다음 0으로 종료합니다. 주어진 제한 시간 내에 문자열을 찾지 못하면 0이 아닌 다른 값으로 종료합니다.
해결 방법 1을 시도했습니다.처음에는 요구 사항으로 시간 초과가 없었으므로 몇 가지 조사 끝에 다음을 사용하기로 결정했습니다.
sudo sh -c '( tail -n1 -f /path/to/nameOfLog.log & ) | grep -q "Started .*Application"'
그러나 이제는 시간 초과 요구 사항이 있습니다. 내가 찾을 때까지 이 명령을 사용하기 위해 시간 초과를 얻는 방법을 알 수 없었습니다.Ondra Žižka의 답변. 그래서 내 새 명령은 다음과 같습니다.
해결 방법 2를 시도해 보세요.
timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)
하지만 이것은 분명히 sudo 권한을 사용하고 있지 않은데, 이는 현재 수정해야 할 사항입니다. 내가 시도한 몇 가지 실패한 변형은 다음과 같습니다.
1번을 시도해보세요:(cmd 앞에 sudo 추가)
sudo timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)
산출:
grep: /dev/fd/63: No such file or directory
2번 시도:(하위 쉘에 cmd를 래핑해보십시오)
sudo sh -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'
산출:
sh: 1: Syntax error: "(" unexpected
sudo를 사용하여 이 명령을 실행할 수 있도록 누군가 나에게 문제와 해결 방법을 보여주고 설명할 수 있습니까? 그리고 정말 시작해야 할 게 있어요시도한 솔루션 1초과 근무도 하게 하시겠습니까?
답변1
1) 여기서 서브쉘(또는 배경)이 유용한지 잘 모르겠습니다.
sudo sh -c '( tail -n1 -f /path/to/nameOfLog.log & ) | grep -q "Started .*Application"'
간단한 파이프라인이 작동하면 안 되나요?
sudo sh -c 'tail -n1 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
2) "1번 시도":
sudo timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)
<()
확장된 입력 리디렉션은 명령줄에서 실행 sudo
되지 않고 열려 있는 sudo
파일 핸들이 전달되지 않으므로 sudo
의사 파일을 열 수 없습니다 .grep
grep
/dev/fd/63
여기 배경도 마찬가지 tail
이므로 불필요합니다.
3) 그리고,PHK 댓글, "2번 시도":
sudo sh -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'
... 다른 기능적인 쉘 sh
대신 명시적으로 실행됩니다. bash
공통 표준 sh
은 지원되지 않으며 <()
Debian 및 Ubuntu에서도 dash
사용되지 않습니다.sh
대신, 이를 실행하면 Ubuntu 에 있을 수 있는 로그인 셸이 su
실행됩니다 . 그러나 둘 다 사용하는 것은 중복됩니다. 그 이후에는 둘 다 권한을 확대하도록 설계되었습니다.root
bash
sudo
su
sudo
이미 높은 권한으로 실행 중입니다.이므로 필요하지 않습니다 su
. 대신 내부에서 쉘을 실행하려면 sudo
다음 중 하나를 지정하십시오.
sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'
답변2
확립된Alexander Batyshev의 답변사용 sudo su -c
.
솔루션(이전):
sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'
고쳐 쓰다:
기반으로일카츄의 답변좀 더 테스트를 해보고 새로운 해결책을 찾았습니다.
첫째,이르카추의
sudo su
중복성 에 대한 질문에 답변하세요 .sudo
명령에서 이를 제거 하면 비밀번호를 묻는 메시지가 표시됩니다.2. 타겟팅이르카추의서브쉘이 유용하지 않다는 질문에 답변합니다. 이것은 사실이다. 그러나 하위 쉘이 없는 명령은 어떤 이유로 로그가 활발하게 기록되는 경우에만 반환됩니다. 그렇지 않으면 중단됩니다. 서브셸을 사용하면 로그가 활발히 기록되지 않는 경우에도 cmd가 반환됩니다. 그래서 저는 subshell 명령을 선호하지만
sh
subshell은 지원되지 않습니다.또한 활동 로그로 테스트할 때 사용 시점
bash
과 사용 시점이sh
다르다는 사실을 발견했습니다. 어떤 이유로sh
반응하는 데 1초가 더 걸립니다bash
.이 두 가지 이유 때문에(subshell 사용 및 지연
sh
) 이것이 적절한 해결책이라고bash
생각하지 않습니다 .sh
3. 대상이르카추의불필요한 &에 대한 답변입니다
tail
. 예, 삭제했습니다. 아무런 효과가 없습니다.
요약:
sudo su 대 su
//prompts for password w/out sudo
su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)''
//works
sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
sh -c를 사용하세요
//either works (sudo or not using sudo)
//but both won't work unless log is actively being written to for some reason
sudo sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
배쉬를 사용하여
//either works (sudo or not using sudo)
sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
새로운 솔루션:
나는 내가 하나를 놓치고 있다는 것을 깨달았다중요한세부 사항. 이는 다음을 통해 수행됩니다.Terraform 원격 실행 구성 프로그램. Terraform은 모든 경우에 대해 서버의 /tmp/ 아래에 로컬 .sh 스크립트를 생성합니다.대기줄주문하다. 이것커뮤니케이터/ssh/communicator.go#!/bin/sh
이는 스크립트 상단에 설정되어 있다는 의미입니다 sh
. 따라서 서브쉘을 사용하고 있으므로 bash를 사용해야 합니다. sudo를 사용할 필요는 없습니다. 이것은 나의 오해였습니다. 그러나 여전히 sudo를 사용할 수 있습니다. 그래서 내 대답은배쉬를 사용하여위의 "요약" 아래에 나열된 명령입니다.
폴리스티렌이 경우 내 대상 서버가 실행 중입니다.14.04.1-우분투. ls -l /bin/sh
프로그램을 실행하므로 /bin/sh -> dash
실제로는 대시 외에는 사용하지 않았습니다 sh
. 그래서 그것 dash
역시 똑같은 좌절감을 갖고 있는 것 같습니다 sh
.