自己拿一台闲置电脑部署了一个postgreSQL服务,然后每次启动电脑之后都得重新执行一下启动命令:
user$user-pc sudo su - postgres //切换到postgres用户下,只有他有权限运行
postgres$user-pc pg_ctl -D /usr/local/pgsql/data start
这样很麻烦。
一是要切换到postgres用户下;
二是要手动启动开启postgresql服务命令。
于是想能不能:
- 在我当前用户下执行postgres用户才能执行的命令。
- 系统启动的时候执行命令。
首先解决第一个问题,在当前用户下执行其他用户命令:
经过查阅stackoverflow,得知我们可以用下面方式以当前用户执行其他用户命令:
su - <username> -c "<commands>"
于是就有了:
sudo su - postgres -c ' pg_ctl -D /usr/local/pgsql/data start '
然后解决第二个问题,启动时执行命令:
由于服务器是ubuntu18.04。记得以前用centos6.5做服务器的时候,启动命令都是写在rc.local下的。但是经查,从ubuntu16.10开始就把rc.local服务化了,独立出systemd。
所以,我们需要写入一个service,写法如下:
首先新建/etc/systemd/system/foo.service
,文件内容:
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
保存退出,执行 :
sudo systemctl daemon-reload
sudo systemctl enable foo.service
于我而言,我创建了/etc/systemd/system/start-postgres.service
文件,里面内容为
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/bin/bash -c " sudo su - postgres -c ' pg_ctl -D /usr/local/pgsql/data start ' "
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
然后执行
$ sudo systemctl daemon-reload
$ sudo systemctl enable foo.service
重启计算机,发现postgres自动启动了。
总结
原先看RHCE教材的时候,不懂systemctl start xxx.service
的具体含义,现在明白了。我们的service都写在/etc/systemd/system/
下,每次开机只要enabled状态的service都会被启动起来。