我被困在如何在机器重新启动后仅执行一次 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 脚本中的运算符更改为>
运算符,然后重试。