내가 달성하고 싶은 것에 대한 설명:
1) 스크립트가 실행된 후 먼저 패키지 이름이 "com.mixplorer"인 파일 관리자가 활성화되어 있는지 확인하고, 활성화되어 있으면 강제 중지한 후 다시 열고, 그렇지 않으면 그냥 엽니다.
2) 이제 파일 관리자가 열렸으므로 파일 관리자 프로세스가 실행되는 동안 루프에서 10초마다 Loopcleaner가 정의한 "log.txt"라는 파일을 계속 삭제합니다.
3) 파일 관리자가 더 이상 활성화되지 않은 경우에만 2단계의 루프 정리 프로세스를 종료하고 Success.txt라는 파일을 만듭니다. 이제 모든 것이 완료되었으므로 스크립트가 종료될 수 있습니다.
이건 내 스크립트야
#!/bin/bash
PACKAGE='com.mixplorer'
if [ $(pidof $PACKAGE) ];
then
am force-stop com.mixplorer && am start -n com.mixplorer/.activities.BrowseActivity;
else
am start -n com.mixplorer/.activities.BrowseActivity;
fi
loopcleaner()
{
rm -rf /sdcard/log.txt
}
while [ $(pidof $PACKAGE) ];
do
loopcleaner;
sleep 2;
if [ ! $(pidof $PACKAGE) ];
then
break
touch /sdcard/successful.txt
fi
exit 0;
done
다음은 디버그 출력입니다. 스크립트가 중간에 중지되어 실행되지 않았음을 명확하게 보여줍니다. 패키지가 활성화된 동안 루프그리고 패키지 이후의 터치 명령이 더 이상 유효하지 않습니다.(분명히 트리거할 기회를 주기 위해 파일 관리자를 수동으로 닫았습니다)
$ su -c sh -x /sdcard/tester.sh
+ PACKAGE=com.mixplorer
+ pidof com.mixplorer
+ '[' ']'
+ pidof com.mixplorer
+ '[' ! ']'
+ am start -n com.mixplorer/.activities.BrowseActivity
Starting: Intent { cmp=com.mixplorer/.activities.BrowseActivity }
+ pidof com.mixplorer
+ '[' ']'
$
답변1
주요 문제는 다음과 같습니다.if [ $(pidof "$package") ]
명령이 수행하는 작업은 다음과 같습니다.
- 해결
"$package"
, 가설foo
pidof foo
비어 있거나 "어쩌고" 출력을 실행 하고 유지합니다.- 이 출력을 테스트하십시오.
[ "blah" ]
또는[ ]
이것은 당신이 원하는 것이 아닐 수도 있습니다.
(명령의 출력 및 반환 코드가 잘못되었습니다.)
원하는 것은 ( pidof
패키지를 찾았을 때 반환 코드가 true인 경우)
if pidof "$package"
또는 ( pidof
패키지를 찾으면 양의 정수를 반환하고, 0
패키지를 찾지 못하면 양의 정수를 반환합니다)
if [ $(pidof "$package") != 0 ]
또는 ( pidof
귀하의 추적에 따르면 결과가 발견되지 않으면 아무것도 반환되지 않습니다)
if [ -n "$(pidof "$package")" ]
then (.. found ..)
else ( .. not found ... )
fi
다음에도 적용됩니다.while
참고로 touch
그 이후에는 실행되지 않습니다 break
.