有两种传统的方法可以实现在启动时执行命令或脚本:
除了常用格式(分 / 时 / 日 / 月 / 周)外,cron 调度器还支持 @reboot 指令。这个指令后面的参数是脚本(启动时要执行的那个脚本)的绝对路径。
然而,这种方法需要注意两点:
a) cron 守护进程必须处于运行状态(通常情况下都会运行),同时
b) 脚本或 crontab 文件必须包含需要的环境变量(如果有的话,参考 StackOverflow 获取更多详细内容)。
这个方法对于 systemd-based 发行版 Linux 同样有效。不过,使用这个方法,需要授予 /etc/rc.d/rc.local 文件执行权限:
# chmod +x /etc/rc.d/rc.local
然后在这个文件底部添加脚本。
下图说明如何分别使用 cron 任务和 rc.local 运行两个示例脚本(/home/gacanepa/script1.sh 和 /home/gacanepa/script2.sh)。
script1.sh:
#!/bin/bash
DATE=$(date +'%F %H:%M:%S')
DIR=/home/gacanepa
echo "Current date and time: $DATE" > $DIR/file1.txt
script2.sh:
#!/bin/bash
SITE="Tecmint.com"
DIR=/home/gacanepa
echo "$SITE rocks... add us to your bookmarks." > $DIR/file2.txt
启动时执行 Linux 脚本
记住,一定要提前给两个示例脚本授予执行权限:
$ chmod +x /home/gacanepa/script1.sh
$ chmod +x /home/gacanepa/script2.sh
要在登录或注销时执行脚本,分别需要使用 ~.bash_profile 和 ~.bash_logout 文件。多数情况下,后者需要手动创建。在每个文件的底部,添加调用脚本代码,如前面例中所示,就可以实现这个功能。
在完成 run level 3 的服务启动后,如果我还有其他的动作想要完成时,举例来说, 我还想要寄一封 mail 给某个系统管理帐号,通知他,系统刚刚重新开机完毕,那么, 是否应该要制作一个 shell script 放置在 /etc/rc.d/init.d/
里面,然后再以连结方式连结到 /etc/rc.d/rc3.d/
里面呢?呵呵!当然不需要!还记得上一小节提到的 /etc/rc.d/rc.local
吧? 这个档案就可以执行您自己想要执行的系统指令了。像不像早期 DOS 年代的 autoexec.bat
与 config.sys
呢?
也就是说,我有任何想要在开机时就进行的工作时,直接将他写入 /etc/rc.local
, 那么该工作就会在开机的时候自动被载入喔!而不必等我们登入系统去启动呢! 是否很方便啊!一般来说,鸟哥就很喜欢把自己制作的 shell script 完整档名写入 /etc/rc.d/rc.local
,如此一来,开机就会将我的 shell script 执行过,真是好棒那!
开机启动时运行脚本有两种方法:
运行级别235登录前都会,加载
/etc/rc.d/rc.local
如上方法二
如果要更具体到那个级别:
可以在
放置在 /etc/rc.d/init.d/
里面
再在/etc/rc.d/rcN.d/
中设置创建软链接
ll /etc/rc.d/rc3.d/ 目录中都是符号链接文件(都是可执行脚本)
lrwxrwxrwx. 1 root root 20 Oct 15 23:19 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Oct 15 23:19 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 17 Dec 8 03:41 S80aegis -> /etc/init.d/aegis
lrwxrwxrwx 1 root root 20 Dec 7 12:40 S98agentwatch -> ../init.d/agentwatch
/etc/rc.d/init.d/netconsole(完整路径)
S表示启动加载,K表示Kill
例子:
/etc/rc.d/init.d/count.sh
ln -s /etc/rc.d/init.d/count.sh /etc/rc.d/rc3.d/K90count.sh
systemd有系统和用户区分;系统(/user/lib/systemd/system/
)、用户(/etc/lib/systemd/user/
).一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/
目录下面。
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Description
: 服务的简单描述
Documentation
: 服务文档
Before、After
:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires
:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants
:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
Type=simple
(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking
:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot
:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify
:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus
:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle
: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile
:pid文件路径
ExecStart
:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload
:指定单元停止时执行的命令或者脚本。
ExecStop
:指定单元停止时执行的命令或者脚本。
PrivateTmp
:True表示给服务分配独立的临时空间
Restart
:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit
:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
Alias
:为单元提供一个空间分离的附加名字。
RequiredBy
:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy
:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also
:指出和单元一起安装或者被协助的单元。
DefaultInstance
:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
systemctl enable nginx.service
就会在/etc/systemd/system/multi-user.target.wants/
目录下新建一个/usr/lib/systemd/system/nginx.service
文件的链接。
#启动服务
$ sudo systemctl start nginx.service
#查看日志
$ sudo journalctl -f -u nginx.service
— Logs begin at 四 2015-06-25 17:32:20 CST. —
6月 25 10:28:24 Leco.lan systemd[1]: Starting nginx – high performance web server…
6月 25 10:28:24 Leco.lan nginx[7976]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
6月 25 10:28:24 Leco.lan nginx[7976]: nginx: configuration file /etc/nginx/nginx.conf test is successful
6月 25 10:28:24 Leco.lan systemd[1]: Started nginx – high performance web server.
#重启
$ sudo systemctl restart nginx.service
#重载
$ sudo systemctl reload nginx.service
#停止
$ sudo systemctl stop nginx.service
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:linux启动时、登录时或注销时执行脚本