linux开机自动执行命令和脚本 自动启动 自启 进程一直运行
方法一:简单的启动命令
直接在/etc/rc.local(/etc/rc.d/rc.local)文件中添加即可
方法二:添加启动项
- 在
/etc/init.d
目录下建立启动脚本,这里建立了文件test
写入内容:(最好先阅读目录下的README
文件说明)
注意所以路径必须是绝对路径
注意需要有LSB 头部
,即那一大堆注释,格式参考openSUSE:Packaging init scripts
#!/bin/bash
### BEGIN INIT INFO
# Provides: Neucrack
# Required-Start: $remote_fs $syslog $network $named
# Required-Stop: $remote_fs $syslog $network
# Should-Start: $network $portmap
# Should-Stop: $network $portmap
# X-Start-Before: nis
# X-Stop-After: nis
# Default-Start: 3 5
# Default-Stop: 0 1 2 4 6
# X-Interactive: true
# Short-Description: ss auto start script
# Description: shadowsocks auto start script,
# This file should be used to construct scripts to be
# placed in /etc/init.d.
### END INIT INFO
case "$1" in
start)
/home/neucrack/software/ss/start_kcptun_client.sh
/home/neucrack/software/ss/start_ss_local.sh
rc_status -v
;;
stop)
/home/neucrack/software/ss/stop_ss_local.sh
/home/neucrack/software/ss/stop_kcptun_client.sh
rc_status -v
;;
restart)
$0 stop
$0 start
rc_status
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
上面这脚本实际上在使用时出现了问题,/home/neucrack/software/ss/start_ss_local.sh
这个命令始终没有被执行,原因是/home/neucrack/software/ss/start_kcptun_client.sh
中的命令阻塞了进程,导致后面一句始终没有执行,可以将他们分别放到后台执行就行了,如何在后台执行可以看文章最后一部分
(/home/neucrack/software/ss/start_kcptun_client.sh &)
(/home/neucrack/software/ss/start_ss_local.sh &)
- 设置脚本文件的执行权限
$ sudo chmod +x /etc/init.d/test
- 使用
update-rc.d
命令将脚本放到启动脚本中去(debian中可以使用更新的insserv
):
$ cd /etc/init.d
$ sudo update-rc.d test defaults 95
注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。更多说明建议看
man update-rc.d
。
也可以自己手动在rc*.d中建立软连接
$ ls -s test ../rc5.d/S95test
这里的rc*.d,*代表启动级别,在不同启动级别启动,K开头的脚本文件代表运行级别加载时需要关闭的,S开头的代表相应级别启动时需要执行,数字代表顺序
- 卸载启动脚本的方法:
$ cd /etc/init.d
$ sudo update-rc.d -f test remove
- 开机会自动自动,也可以手动调用
/etc/init.d/test start
/etc/init.d/test stop
/etc/init.d/test restart
方法三:在redhat,centos等系统中还可以使用chckconfig
来设置自动启动的服务
桌面系统自动启动
桌面系统搜索 启动 ,打开启动管理器 添加删除即可
启动管理器
实用:用户退出后仍然运行该进程的方法(一般用在需要一直运行的进程,比如一个git服务器的进程,在创建后只要没关机都应该在运行,这个时候就需要这个功能):
一般有以下几种方法:
1)在输入命令的最前面加上nohup
命令
如nohup your_command &
这样命令在你退出后仍然会在后台执行
2)setsid
命令
setsid your_command
该命令的结果是使你所运行的命令的父进程为init,所以只有关机该进程才会停止
3)(your_command &)
就是用括号将你的命令括起来,这样做也是使命令的父进程为init
4)disown
当你在命令行下输入your_command &
后命令就在后台执行了,然后执行jobs命令,该命令会列出当前正在后台执行的命令。例如输入命令“top&”
然后执行"jobs"
输出结果是
[1] + Suspended (tty output) top
注意行开头方括号内的数字,该数字叫做jobspec,是给当前后台运行的job的编号。这是你只要在命令行下输入"disown -h 1" 后台运行的top命令就不会受到hangup信号的影响了。
5)使用screen
命令
在命令行下输入screen命令就开启了一个screen进程,它就好像是一个全新的命令运行环境,在该环境中你可以像在正常的terminal下那样执行
命令,但是这个screen是不受其父进程的hangup信号的影响的,既然screen不受其父进程影响,当你意外掉线或者退出系统时,在screen
中仍在执行的命令仍然会继续执行。关于screen命令的使用方法你可以再去查阅相关资料。