컴퓨터를 다시 시작한 후 쉘 스크립트를 한 번만 실행하는 방법에 대해 고민하고 있습니다. 파일에 다음 내용이 있고 파일에서 첫 번째 요소만 가져오는 테스트를 작성하고 있습니다.
#!/bin/bash
echo "A" >> /home/vtr/Documents/test.txt
echo "B" >> /home/vtr/Documents/test.txt
echo "C" >> /home/vtr/Documents/test.txt
sleep 10 #this sleep I put only to the lines below be executed when the machine came back to the desktop
test=$(sort /home/vtr/Documents/test.txt | uniq | head -n 1)
echo $test >> /home/vtr/Documents/finaltest.txt
나는 cron과 systemd를 통해 이 작업을 수행했지만 둘 다 A
출력으로만 여러 번 실행되는 파일을 얻습니다.
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
이것은 내 /etc/systemd/system/testing.service
파일입니다:
[Unit]
Description=One test script
After=network.target
[Service]
Type=oneshot
ExecStart=/home/vtr/Documents/testing.sh
[Install]
WantedBy=multi-user.target
또한 위의 절전, 테스트 및 에코 줄 없이 "A", "B" 및 "C"만 쓰는 테스트를 실행하려고 시도했지만 echo "C" >> /home/vtr/Documents/test.txt
동일한 내용이 있습니다. 출력 파일은 다음과 같아야 합니다.
A
B
C
그러나 실제로는 몇 번 인쇄하고 실행하기도 합니다.
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
재부팅 후 스크립트를 한 번 실행하는 방법이 있습니까?
답변1
먼저 스크립트를 단순화할 수 있습니다.
#!/bin/bash
printf "A\nB\nC\n" >> /home/vtr/Documents/test.txt
sleep 10
sort -u /home/vtr/Documents/test.txt |tee /home/vtr/Documents/test.txt | head -1 >> /home/vtr/Documents/finaltest.txt
cron
다음과 같은 레코드를 추가하면 :
@reboot /home/vtr/Documents/testing.sh
시작 시 스크립트를 실행합니다.
테스트를 위해 다음과 같은 스크립트를 작성할 수 있습니다.
printf "A\nB\nC\n" >> /home/vtr/Documents/1.txt
sleep 10
sort -u /home/vtr/Documents/test.txt >/home/vtr/Documents/2.txt
sort -u /home/vtr/Documents/test.txt|tee /home/vtr/Documents/test.txt >/home/vtr/Documents/3.txt
sort -u /home/vtr/Documents/test.txt |tee /home/vtr/Documents/test.txt | head -1 >> /home/vtr/Documents/4.txt
그리고 이 파일의 내용을 조사해 보세요. 첫 번째 줄 뒤에 추가하여 만들 수도 있습니다.
#!/bin/bash
set -x
답변2
크론탭을 사용해 보셨나요?@reboot
범위? 어쩌면 @reboot /path/to/bashscript.sh
crontab 파일 끝에 추가된 명령을 사용해야 할 수도 있습니다 crontab -e
. 또한 >>
bash 스크립트의 연산자를 >
연산자로 변경하고 다시 시도하십시오.