重启后运行一次shell脚本文件

重启后运行一次shell脚本文件

我被困在如何在机器重新启动后仅执行一次 shell 脚本,我所拥有的文件具有以下内容,我正在编写一个测试以仅从文件中获取第一个元素:

#!/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

你有没有尝试过 crontab@reboot范围?也许您应该@reboot /path/to/bashscript.sh使用命令添加到 crontab 文件的末尾crontab -e。还将>>bash 脚本中的运算符更改为>运算符,然后重试。

相关内容