コンピュータを再起動した後、シェルスクリプトを一度だけ実行する方法を心配しています。ファイルに次の内容があり、ファイルから最初の要素のみをインポートするテストを作成しています。
#!/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スクリプトの演算子を>
演算子に変更してもう一度やり直してください。