SharedIT | 묻고 답하기(AMP)

스크립트 작성시 순차적으로 수행

 스크립트 작성 중입니다. 연속된 명령어 수행후  끝난다음 다음 연속된 명령어 수행을 하고 싶습니다.

 ex) # vi tar_back.sh  

1번 tar -cvf tar.tar /etc/*>/tmp/tar.log ;tar -cvf tar1.tar /var/*>>/tmp/tar.log  ---> 순차적으로 들어 가는거 확인

2번 tar -cvf tar2.tar /usr/*>/tmp/tar.log;tar -cvf tar3.tar /bin/*>>/tmp/tar.log

3번                                       "

4번                                        "

제가 원하는 건 1번 수행 마친다음 2번 수행 하려고 합니다. 로그도 한파일로 순차적으로 저장 하기

중간에 sleep 을 넣을라니까 예상 시간을 모르니 sleep 6000 이렇게 할 수도 없고 

1번 명령어 수행 마치고  2번 명령어 수행 마치고  다음 3번 4번 이렇게  순차적 으로 수행 할 수 있도록 하고 싶습니다. 

고수님들 은 어떻게 하시는지 부탁 드립니다.

감사합니다.


Tags : 태그가 없습니다.

5개의 답변이 있습니다.

deerokgo
  0 추천 | 약 2년 전

쉽지 않을거 같은데요

하나의 작업이 끝난 후에 다음 작업이 돌아가야 하는데

쉘로 만들면 이전 작업 종료 전이라도 다음 작업이 실행 되어 버리죠

조건문 등을 넣어야 하는데 아이디어가 좀 필요하겠네요



Simon.Park
  0 추천 | 약 2년 전

script 를 짜셔야 할 듯 한데, 

if 문이나 do ~ while 등을 조합해서 앞전에 수행한 process 가 수행이 끝난 다음에

다음 명령어를 수행하게끔 하는 방법이 있는데요,

조금 이 방법도 좋은 방법은 아닐 듯 싶은데요....

급한게 아니라면 시간 차를 두고 실행을 하시는게...

정 아니면 log 파일을 따로 지정하셔도 보시는데는 문제 없지 않나요?

Genghis Khan
  0 추천 | 약 2년 전

crontab으로 일정 분,시 ,일  나눠서도 가능하죠

topkslee
  0 추천 | 약 2년 전

*.sh 스크립트는 윈도우 *.bat 파일과 동일하게 특별한 구문이 없는 한

위에서 차례대로 실행되니 언급해주신 대로 나열하시면 됩니다.

보통은 중간 사이에 로그확인을 하기 위해 일자나 완료되었다는 문구를 남기기도 합니다.

echo `date`

echo  "Completed" 등등

wansoo
  0 추천 | 약 2년 전

순서대로 적으면 순서대로 수행됩니다.

앞 명령이 끝나지 않았는데, 뒷 명령이 실행되지는 않습니다.

만약 앞 명령이 끝나기 전에 뒷 명령이 실행되게 하고 싶다면 앞 명령을 백그라운드로 실행시켜 주면 되겠고요.

wansoo | 약 2년 전

불필요하게 sleep을 넣어 처리 시간이 지연되게 할 이유는 없어 보이네요.

명령을 ; 을 붙여서 한 줄에 적는거랑 각 라인에 명령을 적는 거랑 실행에 있어서 차이가 없습니다.

여러줄에 명령을 적는걸 한줄에다 적고 싶다면 ; 를 사용해서 구분해 주면 되고,

스크립트에서 수행 시킬때는 특수한 목적이 있을 경우가 아니라면

굳이 여러 명령을 ; 로 구분하여 한줄에 적을 필요도 없을 것 같고요.


mine39 | 약 2년 전

답변에 감사드립니다. 

제가 만든 파일인데요 저는 순차적으로 안들어 가고 동시에 명령어가 실행되는거 같아요!

#!/bin/sh

/home/test/Test_A/cycle2/run  /home/test/Test_plant/cycle2/AA_cycle2

/home/test/Test_A/cycle3/run  /home/test/Test_plant/cycle3/AA_cycle3

/home/test/Test_A/cycle4/run  /home/test/Test_plant/cycle4/AA_cycle4


이렇게 했을시 동시에 작업 들어가서 수행이 안되네요!

작업은 "run" 은 스크립터파일이고 "AA_cycle" 은  input 파일 입니다.

클러스터 병렬처리 하는 시스템입니다. 

단순하게 1번 끈나고 2번 수행 하면 되는데 qstat 로 보면 잡이 동시에 들어 갑니다.

mine39 | 약 2년 전


home/test/Test_A/cycle2/run  /home/test/Test_plant/cycle2/AA_cycle2 

 

한주기 작업 수행시간이 보통 4 -5 시간 걸리는 작업 입니다. 


한주기 끝나고 다음 주기를 시작 해야 하는 스크립트를 짜는 중입니다. 


말씀대로 동시에 작업이 들어가지는 안는거 같습니다. 

그러나  일정 시간 지나면  2번 3번 작업이 큐에  들어가있어 2번 부터 작업진행이 안되네요!


작업 쉘은 1번 작업이 끈나야 2번 쉘이 돌아가는 구조 입니다. 



 

wansoo | 약 2년 전

순차적으로 실행되지 않고 동시에 수행된다는 건, 

스크립트 파일...

즉... /home/test/Test_A/cycle2/run 에서 명령을 실행시킬때 백그라운드로 실행시키고 있다는 것입니다.


cat /home/test/Test_A/cycle2/run | grep "&"

하셔서 /home/test/Test_A/cycle2/run  script 안에서 명령어에 & 를 붙여서 백그라운드로 실행시키는 명령들이 어떤게 있는지 확인해 보세요.


스크립트 안에서 명령을 &를 붙여서 백그라운드로 실행시키고 있기 때문에 명령 수행이 끝나지 않았는데도 다음 명령이 실행되고 있는 것입니다.


순차적으로 명령이 수행되게 하고 싶다면 run script 안에서 명령들이 백그라운드로 실행되지 않게 명령뒤에 붙어 있는 &를 제거해 주면 되겠고요.


만약에...

이전 명령이 백그라운드로 실행되고 있는데도 이전 명령이 끝날때까지 억지로 기다렸다 처리되게 만들고 싶다면


다음 명령 앞에 아래와 같이 이전 명령이 종료되었는지는 체크해서 이전 명령이 끝날때까지 기다리게 하는 명령을 넣어 주면 되겠고요.


ps -ef | grep -v grep | grep 백그라운드수행명령 

while [ $? != 0 ]

do 

  sleep 1

  ps -ef | grep -v grep | grep 백그라운드수행명령

done



wansoo | 약 2년 전

구체적인 도움을 드릴 수 있으려면

/home/test/Test_A/cycle2/

/home/test/Test_A/cycle3/

/home/test/Test_A/cycle4/


에 있는 run file이 어떻게 구성되어 있는지...

run에서 또 다른 명령을 실행 시키고 있을 때 실행되는 그 명령들이 내부적으로 어떻게 구성되어 있는지를 알아야 추가적이 이야기가 진행될 수 있을 것 같네요.


shell script에서 기본적으로 명령들은 이전 명령이 끝나야 실행되게 됩니다.


run 이란 이름에서... thread 등의 개념으로 다른 명령을 실행시키기 위한 목적으로 만들어 졌을 것 같다는 느낌이 드네요. 

mine39 | 약 2년 전

답변에 대하여 감사드립니다.

말씀대로 스크립트 파일(run)에서 다른 명령을 실행 시키는 (복잡한)내용이 들어 있어요~

그 결과를 cycle 의 input 파일을 받아 결과를 처리 하는 방식 입니다.

""ps -ef | grep -v grep | grep 백그라운드수행명령 

while [ $? != 0 ]

do 

  sleep 1

  ps -ef | grep -v grep | grep 백그라운드수행명령

done""


이방식으로 테스트 진행 해 보겠습니다. 


님때문에 실마리가 풀리고 있습니다.  다시한번 감사 드립니다. 

wansoo | 약 2년 전

ps -ef | grep -v grep | grep 백그라운드수행명령


사용할때 주의 점은 "백그라운드수행명령"이 다른 프로세서와 구분 가능한 문자열로 구성되어 있어야 합니다.

run 처럼 일반적으로 많이 사용하는 실행 파일이름이라면 다른 프로세서와 구분이 어려워 제 역할을 하기 어렵습니다.


실행 파일이름을 다른 프로세서와 구분가능한 이름으로해서 적당히 길게 만들어야 합니다.

wansoo | 약 2년 전

while 문 조건식에 != 이 아닌 ==을 넣으셔야 겠네요.

제가 착각한 것 같습니다.


명령을 아래와 같이 사용하셔야 찾으려는 프로세서가 없을때 while 문을 종료하게 되겠네요.


ps -ef | grep -v grep | grep 백그라운드수행명령 

while [ $? == 0 ]

do 

  sleep 1

  ps -ef | grep -v grep | grep 백그라운드수행명령

done