Ubuntu 16.04 启动脚本不起作用

Ubuntu 16.04 启动脚本不起作用

我有一个简单的脚本(将 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
如前所述,您可能需要根据需要对计时器和服务进行一些调整。

相关内容