![Bash 스크립트를 사용하여 중지된 작업을 종료할 수 없습니다.](https://linux55.com/image/190330/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%A4%91%EC%A7%80%EB%90%9C%20%EC%9E%91%EC%97%85%EC%9D%84%20%EC%A2%85%EB%A3%8C%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
for i in $( seq 1 $1 )
do
kill %$i
done
이 스크립트를 사용하여 중지된 작업을 종료하려고 시도했지만 재미있는 점은 열려 있는 작업이 있어도 이를 수행할 수 없다는 것입니다.
$ jobs
[10] Stopped vim detect_thread.py
[11] Stopped python3 detect.py
[12]- Stopped python3 detect.py
[13]+ Stopped python3 detect.py
$ kill 13
bash: kill: (13) - No such process
$ ./delete.sh 13
./delete.sh: line 8: kill: %1: no such job
./delete.sh: line 8: kill: %2: no such job
./delete.sh: line 8: kill: %3: no such job
./delete.sh: line 8: kill: %4: no such job
./delete.sh: line 8: kill: %5: no such job
./delete.sh: line 8: kill: %6: no such job
./delete.sh: line 8: kill: %7: no such job
./delete.sh: line 8: kill: %8: no such job
./delete.sh: line 8: kill: %9: no such job
./delete.sh: line 8: kill: %10: no such job
./delete.sh: line 8: kill: %11: no such job
./delete.sh: line 8: kill: %12: no such job
./delete.sh: line 8: kill: %13: no such job
답변1
내장 함수는 현재 셸에서 실행 중인 작업의 형식 kill
만 인식합니다 . %N
그러나 셸 스크립트는 별도의 자체 하위 셸에서 실행되며 해당 하위 셸 내에서는 종료할 작업이 없습니다. 다음 예를 보면 더 명확해질 수 있습니다.
$ for i in {1..5}; do sleep 100 & done
[1] 2259152
[2] 2259153
[3] 2259154
[4] 2259155
[5] 2259156
$ for i in {1..5}; do kill %$i; done
[1] Terminated sleep 100
[2] Terminated sleep 100
[3] Terminated sleep 100
[4]- Terminated sleep 100
[5]+ Terminated sleep 100
보시다시피, 동일한 셸 세션에서 두 명령 세트를 모두 실행하면 예상대로 작동합니다. 마찬가지로 동일한 쉘 스크립트에서 명령을 시작하고 종료하면 작동합니다.
#! /usr/bin/env bash
for i in {1..5}; do
sleep 100 &
done
## Show the running jobs
runningSleepJobs=$(pgrep -c sleep)
echo "There are $runningSleepJobs sleep jobs running!"
for i in {1..5}; do
kill %$i;
done
## Show that they've been stopped
runningSleepJobs=$(pgrep -c sleep)
echo "Now there are $runningSleepJobs sleep jobs running!"
지금 이 스크립트를 실행하면 예상대로 작업이 시작되고 종료되는 것을 볼 수 있습니다.
$ foo.sh
There are 5 sleep jobs running!
Now there are 0 sleep jobs running!
그러나 이 문제를 해결할 수 있는 방법이 있습니다. 바꾸다스크립트를 실행하면 얻을 수 있습니다현재 쉘에서 실행되도록:
$ cat ~/bin/foo.sh
#! /usr/bin/env bash
for i in $( seq 1 $1 )
do
kill %$i
done
$ for i in {1..5}; do sleep 100 & done
[1] 2295221
[2] 2295222
[3] 2295223
[4] 2295224
[5] 2295225
$ jobs
[1] Running sleep 100 &
[2] Running sleep 100 &
[3] Running sleep 100 &
[4]- Running sleep 100 &
[5]+ Running sleep 100 &
$ . ~/scripts/foo.sh 5
[1] Terminated sleep 100
[2] Terminated sleep 100
[3] Terminated sleep 100
[4]- Terminated sleep 100
[5]+ Terminated sleep 100
답변2
셸 스크립트는 자체 환경에서 실행됩니다. 즉, 작업 관리에서는 스크립트를 실행하는 셸의 작업 목록을 알 수 없습니다. .
현재 환경에서 스크립트를 실행 하려면 다음을 수행하세요.
$ . ./delete.sh 13