如何实现Shell脚本开机自运行
场景
工作中使用电脑要求使用相关的工作软件,开机自启动的
需求
工作日晚8点之后和周末都要自动关闭相关的工作软件
花了一点时间摸索出来,整理总结下便于以后回顾。
Shell脚本相关
根据以上需求,编写Shell脚本,脚本内容如下:
#!/bin/bash
limit_time=20
current_hour=`date "+%H"`
current_weekday=`date "+%w"`
killProcess(){procress_pids=`ps -ef | grep -E 'AliEntSafe|AliLang' | awk '{print $2}'`for pid in $procress_pidsdokill -9 $piddone
}
# 周末
if [[ $current_weekday -eq 0 || $current_weekday -eq 6 ]]
thenkillProcess
# 工作日
elif [[ $current_hour -ge $limit_time ]]
thenkillProcess
fi
上面的脚本是一个简单逻辑的脚本很基础,对于初学者学习点有:
- date获取小时和星期几
- ps + grep获取指定进程,awk获取pid集合
- kill杀死进程
- if流程控制+for循环控制
- 比较运算符相关
具体Shell教程可以去搜索看下,这里我介绍下我知道的Shell中使用到的各种括号的作用:
[]、()、[[]]、(())、{}
- 执行命令并赋值给变量:``、()
``和()都可以用来命令的执行,但是二者还是存在区别:
- ()不是所有Shell都支持的,而``所有Shell都支持
current_date=`date`
current_date=$(date)
- 一串命令执行:()、{}
二者的区别和联系:
- ()会重开一个子Shell进行执行,{}是在当前Shell中执行
- 都是使用;分割命令,但()最后一个命令可以不要;,而{}必须要
- {}中第一个命令前要加一空格
(var=notes;echo $var)
{ var=notes;echo $var;}
- 引用变量:、、、{}
var=notes
echo $var
echo ${var}
- 用于判断语句中的条件包裹:[]、[[]]
下面三个都是实现一样的功能
if [ $var -lt 5 -a $var -gt 4 ]
if [ $var -lt 5 ] && [ $var -gt 4 ]
if [[ $var -lt 5 && $var -gt 4 ]]
- 数组定义:()
array=(1 2 3 4)
- for循环条件包裹:(())
下面都是实现1到10的遍历,可以看出:
- for循环的数据源可以使命令或变量
- 可以使用(())来包裹循环条件
- 可是使用{n…m}来获取从n到m的数据,类似seq命令
for i in `seq 1 10`;do echo $i;done
for i in $(seq 1 10);do echo $i;done
for ((i=1;i<=10;i++));do echo $i;done
for i in {1..10};do echo $i;done
- 数值计算:(())
使用(())包裹数值计算,例如:
count=$(( a % 2))
补充:
{}还可以实现列表的效果
ls {ex1,ex2,ex3}.sh
# 等价
ls {ex{1..3}}.sh
# 等价
ls ex1.sh ex2.sh ex3.sh
在Linux中文件权限分为:可读、可写、可执行
需要赋予该sh文件(kill_process.sh)可执行权限
chmod a+x kill_process.sh
这样就赋予所有人可执行Shel脚本的权限了
使用launchd来实现脚本开机自执行
首先看看launchd的介绍,使用man launchd显示详情:
从上面截图中可以看出launchd相关的介绍,大致可知:
> launchd:用于管理进程,系统级别或用户级别
> 对外的用户接口是launchctl命令,用户或管理员可以使用该命令添加或重启任务
launchd作为系统中第一个进程
设置launchd相关进程的具体目录是在FilES所列的,具体上分为系统级别和用户级别两类
设置自启动的一种方式就是在设置用户级别的任务:
即在/Library/LaunchAgents下建立plist文件
plist文件相关的可以使用man launchd.plist来查看相关的配置,实际上plist是xml文件配置
本次用于执行kill_process.sh文件的plist设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><!-- 定义服务名称 --><key>Label</key><string>com.custom.sheet</string><!-- 定义运行脚本具体路径 --><key>ProgramArguments</key><array><string>/Library/LaunchAgents/kill_process.sh</string></array><!-- 定义是否在启动时运行 --><key>RunAtLoad</key><true/><!-- 定义是否一直运行 --><key>KeepAlive</key><dict><!-- 表示运行成功之后就退出任务 --><key>SuccessfulExit</key><true /></dict><!-- 标准错误输出 --><key>StandardErrorPath</key><string>/dev/null</string><key>StandardOutPath</key><string>/dev/null</string>
</dict>
</plist>
在/Library/LaunchAgents下定义名为com.custom.sheet.plist文件
执行sudo chown root:wheel com.custom.sheet.list
执行sudo chown root:wheel kill_process.sh
使用sudo launchctl load /Library/LaunchAgents/com.custom.sheet.plist,加载任务到launchd即可
使用自动程序实现开机自运行
使用Mac上的自动操作生成app程序来实现开启自动执行
在上面的截图中选择应用程序,搜索运行shell脚本:
创建APP,定义脚本:
cd 脚本目录
open -a Terminal.app kill_process.sh
保存就行,然后将定义的app添加到开机自启动上就行,即系统偏好设置 - 用户与群组 - 登录项
总结
目前所知两种方式实现Shell脚本自启动:
- 使用launchd来实现
- 使用自动操作定义应用程序+启动项来实现,不过这种方式报错或有弹出框提示
如何实现Shell脚本开机自运行相关推荐
- 使用shell脚本监控程序的运行和停止
最近在自学shell,编写了一个shell脚本监控程序的运行,打印出开始时间和结束时间,查了一些资料,写了一个简单的脚本,希望对大家有用. #!/bin/bash# 指定一个写入开始和结束时间的txt ...
- 单独运行shell脚本与crontab运行shell脚本的区别
crontab运行脚本存在两大问题:环境变量和路径,从而导致单独运行脚本没问题,但用crontab运行就报错. 1.环境变量 描述问题:crontab: usage error: no argumen ...
- 让shell脚本开机自启动方法
在/etc/rc.local文件添加shell脚本的执行语句: bash -l [PATH]/filename.sh 这里之所以需要加"-l"参数(小写的L)是想让bash ...
- linux执行shell过程日志,Android之在linux终端执行shell脚本直接打印当前运行app的日志...
1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 a ...
- Shell脚本:后台运行
1. 名词解释 名词(中文) 名词(英文) 解释 会话 Session 每打开一次终端(本地或远程)登录Linux,都会生成一个新的会话:除此之外,程序中也可以调用函数setsid创建一个新的会话:脚 ...
- centos7 shell脚本开机自启动(亲测可用)
尝试了各种自启动,以下方式是唯一有效的 一. 编辑脚本 内容如下示例: ==================== startCrontab.sh =================== #!/bin/ ...
- python脚本开机自动运行
step1:按 ctrl+r 打开终端,输入 shell:startup 进入到程序启动目录 step2:建立 xxx.bat 文件,内容如下: @echo off if "%1" ...
- linux开机自动启动开机日志,设置linux开机自动运行脚本
实现目标:在Linux启动时,自动运行位于普通用户test1根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志文件追加一条记录,源码如下: from datetime import ...
- 在Linux中开机自动运行普通用户脚本程序
测试环境:Fedora7,管理员:root,普通用户:test1 实现目标:在Linux启动时,自动运行位于普通用户test1根目录下的脚本程序test.py,该程序会在每次执行时自动向本地日志文件追 ...
最新文章
- 阿里云oss 上传图片 python3
- NVisionXR_iOS教程二 —— 创建控制器和Vuforia对象
- Eclipse的JQuery提示插件-Spket(别试了,没什么效果,且安装设置麻烦)
- 告别2017!2018投影市场变革机遇与挑战并存
- 流程DEMO-补打卡
- 配置使用EF6.0常见的一些问题及解决方案
- CodeForces - 1538G Gift Set(二分)
- 如何定义一个有效的OWIN Startup Class
- c语言 指针 pdf,深入理解c指针 PDF扫描版[33MB]
- js ajax java传参_ajax参数传递与后台接收
- (23)FPGA面试技能提升篇(SSC接口、V35接口)
- php生成站点地图,php生成百度站点地图sitemap.xml
- 网易漫画Swift混编实践
- 关于行业的浅析以及未来工作的前景初判
- 别不把自己当有钱人 ——让白领族成为百万富翁族的六大理财秘籍
- Logs Viewer
- php留言板开发功能,PHP实现基本留言板功能原理与步骤详解
- Electron+Vue3+TypeScript+Vite桌面应用程序项目初始化
- CSS盒子模型隐藏的几种方式
- python pdf解析毕业论文_电影数据读取、分析与展示毕业论文+任务书+Python项目源码...
热门文章
- ArcGIS制图学习(3)
- 云队友丨当代攒钱青年现状:没变富,先「变负」
- 封装link或style中的css规则
- 2021年危险化学品生产单位安全生产管理人员最新解析及危险化学品生产单位安全生产管理人员作业模拟考试
- 【BZOJ3837】[Pa2013]Filary 随机化神题
- Android程序员春招三面蚂蚁金服,7年老Android一次坑爹的面试经历,先睹为快
- 3个开源音乐播放器:Aqualung,Lollypop和GogglesMM
- iimap服务器没有响应,解决imap被vimIM和谐掉的问题
- Linux--自旋锁(介绍及API简介)
- qq上word文件失效怎么恢复