再起動後、シェルスクリプトファイルを一度実行します。

再起動後、シェルスクリプトファイルを一度実行します。

コンピュータを再起動した後、シェルスクリプトを一度だけ実行する方法を心配しています。ファイルに次の内容があり、ファイルから最初の要素のみをインポートするテストを作成しています。

#!/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.shcrontabファイルの最後に追加されたコマンドを使用する必要がありますcrontab -e。また、>>bashスクリプトの演算子を>演算子に変更してもう一度やり直してください。

関連情報