前面一篇文章中,我们己经在Docker中的Ubuntu中建立好了各种任务,比如nginx
, sslh
, ssh
等等,域名什么的也配置好了。但是因为没有固定的IP地址,我们还是需要实现一个动态DDNS的功能,这个我们也通过脚本实现了,但是这个脚本需要定时运行,之前常用的方式是通过crontab
建立一个周期性的任务,但是Docker
中似乎没有这个,网上转了一圈发现可以通过如下的方式安装cron
.
sudo apt install cron
熟练的加上一条任务:
*/10 * * * * /home/major/work/apps/ali_ddns.sh>/home/major/cron.log
加了之后,睡了一觉,NAS访问不了了,看了一圈,发现是DNS解析有问题,也就是相应的DNS记录并没有更新,这个cron也是完全没有Log,这个可咋整?网上又转悠了好久,发现如下的解决方法和/etc/pam.d/cron
这个文件有关系,解决方法是把其中的一行进行注释就可以了:
# session required pam_loginuid.so
这样就可以正常的使用cron
了,以后有需要就可以直接放到这里面就可以了。
需要说明的是Docker
中,后面安装的一些服务,比如nginx
, sslh
, ssh
, cron
等都不会自动启动,没错cron
也在里面,所以想通过@startup
方式启动服务也是不可行的,因为我在Docker启动的时候默认是运行bash
的,所以这些任务都不能自动启动。
服务的自启动
其实NAS上面的ubuntu容器默认是运行了一个bash
,这样我们就可以通过终端去访问这个容器了,本来想着可以把这个命令改成我们自己定义的一个脚本,但是GUI界面似乎是不支持这个操作的,反正我找了挺久是没找到设置的具体位置。
此路不通,只有另想它法,既然镜像启动的时候运行了一个bash
命令,那么我们可不可以从这个bash
命令上做做文章呢?
答案是可以!!我们知道bash
在运行的时候支持通过.bash_profile
或者.bashrc
实现比如设置别名等操作的前置命令,也就是说在这个脚本里面的命令都会在运行bash的时候被调用,那么我们是不是把需要开启的服务放到这个文件里面就行了呢?
答案是可以!!我们直接在.bashrc
的末尾添加需要运行的命令就可以了,当然周期性的任务还是放到crontab
中就好了,而cron
的服务我们通过.bashrc
开启就可以了,这样重启docker镜像之后,所有的服务都可以自动启动了,是不是非常完美?
答案是完美!!可以继续愉快的玩NAS了,还是个不断电的系统,爽歪歪呀。