我有一个简单的脚本(将 postgresql db 转储上传到 google drive),如果我在终端中运行此脚本,一切都会正常。现在我想在系统启动时运行此脚本
我将脚本添加到文件夹/etc/init.d
,脚本名称为gdrive-upload
:
#! /bin/sh
### BEGIN INIT INFO
# Provides: gdrive-upload
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
sleep 60
while true; do
name=$(date -d "today" +"dev_%Y-%m-%d_%H:%M").dump
PGPASSWORD='passToDB' pg_dump -h localhost -p 5432 -U lm -F c -b -v -f /postgresql/dump/${name} DBname
gdrive upload /postgresql/dump/${name}
sudo rm /postgresql/dump/${name}
sleep 3600
done
该文件的文件权限为:755
要执行此脚本我运行sudo chmod a+x /etc/init.d/gdrive-upload
在此之后没有输出
然后sudo update-rc.d gdrive-upload defaults
在此之后:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
insserv: warning: current stop runlevel(s) (1 6) of script `gdrive-upload' overrides LSB defaults (0 1 6).
但脚本没有运行sudo reboot
但如果我/etc/init.d/gdrive-upload
在终端运行,一切都正常
答案1
由于您使用的是 Ubuntu 16.04,因此systemd
您可能需要使用systemd
本机服务和计时器组合。
将实际工作放入脚本中。例如/usr/local/sbin/gdrive-upload.sh
#!/bin/bash
name=$(date -d "today" +"dev_%Y-%m-%d_%H:%M").dump
PGPASSWORD='passToDB' pg_dump -h localhost -p 5432 -U lm -F c -b -v -f /postgresql/dump/${name} DBname
gdrive upload /postgresql/dump/${name}
sudo rm /postgresql/dump/${name}
相应的服务/etc/systemd/system/gdrive-upload.service
文件如下所示,但可能需要进行一些调整。
[Unit]
Description=Upload stuff to gdrive
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/gdrive-upload.sh
[Install]
WantedBy=multi-user.target
然后您需要一个systemd
计时器/etc/systemd/system/gdrive-upload.timer
来定期运行服务文件。
[Unit]
Description=Regularly upload stuff to gdrive
[Timer]
OnCalendar=*-*-* *:00:00
Persistent=true
[Install]
WantedBy=timers.target
创建文件后,您必须告知systemd
有新的服务可供拾取并启用计时器。
$ systemctl daemon-reload
$ systemctl enable gdrive-upload.timer
$ systemctl start gdrive-upload.timer
不要启用,gdrive-upload.service
因为这将由计时器触发。
现在,您可以使用 来查看计时器上次触发的时间以及下次触发的时间systemclt list-timers
。
如前所述,您可能需要根据需要对计时器和服务进行一些调整。