欢迎各位兄弟 发布技术文章
这里的技术是共享的
#!/bin/bash
sudo crontab -u aaaa -l | grep . notEmpty=$? sudo crontab -u aaaa -l | grep -F "@reboot" | grep -F "/Users/aaaa/app/getinfoscript.sh" if [ $? -ne 0 ];then /usr/bin/expect <<EOF
set timeout 5 spawn crontab -u aaaa -e
if { $notEmpty == 1 } { send "i" } else { send "G" send "o" } send "@reboot /Users/aaaa/app/getinfoscript.sh\r" send "0 10 * * * /Users/aaaa/app/getinfoscript.sh" send "\x1b:wq\r" #send ";2R1;95;0c\r" expect "exit\r" expect eof EOF fi
expect: spawn id exp6 not open
while executing
"expect eof
根据您提供的 Bash 脚本和遇到的错误消息 expect: spawn id exp6 not open
,问题通常是因为 expect
尝试与一个未成功执行的进程进行交互。
检查 Cron 作业: 脚本首先检查用户 aaaa
的 crontab 是否为空,并检索是否存在指定的启动任务 @reboot
的 cron 任务。
Expect 块: expect
部分旨在与 crontab 编辑器交互,然而,这可能在某些情况下不起作用(例如,当 crontab -e
打开一个交互式编辑器时)。
为了避免使用 expect
,建议直接编辑 crontab 文件,可以通过临时文件的方式实现:
bash
#!/bin/bash # 创建临时文件存储 crontab TEMP_CRONTAB=$(mktemp) # 将当前 crontab 加载到临时文件中 sudo crontab -u aaaa -l > $TEMP_CRONTAB 2>/dev/null # 检查特定的 cron 作业是否已经存在 if ! grep -q "@reboot /Users/aaaa/app/getinfoscript.sh" $TEMP_CRONTAB; then # 如果不存在,添加至临时文件 echo "@reboot /Users/aaaa/app/getinfoscript.sh" >> $TEMP_CRONTAB echo "0 10 * * * /Users/aaaa/app/getinfoscript.sh" >> $TEMP_CRONTAB # 安装新创建的 crontab sudo crontab -u aaaa $TEMP_CRONTAB # 清理临时文件 rm -f $TEMP_CRONTAB else echo "Cron job 已经存在。" fi
此脚本使用临时文件管理 crontab 条目。
首先加载 aaaa
的当前 crontab,并检查需要的作业是否存在,如果不存在,则进行添加。
最后,将修改后的 crontab 安装回用户。
通过 mktemp
创建的临时文件,确保不会留下多余的文件。
确保运行此脚本的用户有足够的权限来修改 aaaa
用户的 crontab。如果需要,可以使用 sudo
获得相应的权限。
请注意,这仍然假设您已经配置了无密码的 sudo
权限):
bash复制代码#!/bin/bash
# 检查当前 crontab 是否有该条目,以避免重复添加 if ! crontab -u myuser -l | grep -q "sudo systemsetup -setusingnetworktime on"; then # 如果没有找到该条目,则添加它 (crontab -u myuser -l 2>/dev/null; echo "*/2 * * * * sudo systemsetup -setusingnetworktime on") | crontab -u myuser - fi
(crontab -l; echo "*/2 * * * * sudo systemsetup -setusingnetworktime on") | crontab -
(crontab -u myuser -l; echo "*/2 * * * * sudo systemsetup -setusingnetworktime on") | crontab -u myuser -
详解
这条命令是用于在 Linux 或 macOS 系统中,通过 crontab
工具来设置一个定时任务,该任务每两分钟执行一次,以启用系统的网络时间同步功能。不过,需要注意的是,sudo systemsetup -setusingnetworktime on
命令是 macOS 特有的,用于控制系统是否使用网络时间协议(NTP)来同步时间。在 Linux 系统中,这个命令将不会工作,因为 Linux 使用不同的工具(如 timedatectl
或 ntpdate
)来管理时间同步。
下面是对这条命令的详细解释:
crontab -l
:这个命令用于列出当前用户的 crontab 文件内容。crontab 文件是一个文本文件,用于存储定时任务的配置。每个任务都有一行配置,指定了任务执行的时间、日期以及要执行的命令。
echo "*/2 * * * * sudo systemsetup -setusingnetworktime on"
:这个命令使用 echo
将一个字符串输出到标准输出(stdout)。这个字符串是一个 crontab 任务的配置,它指定了一个定时任务,该任务每两分钟(*/2 * * * *
)执行一次 sudo systemsetup -setusingnetworktime on
命令。这里的 */2
表示每两小时的每个第 0 分钟和第 30 分钟执行一次,但由于它位于分钟字段,实际上意味着每两分钟执行一次。
|
:这个符号是管道(pipe)操作符,它的作用是将前一个命令的输出作为后一个命令的输入。
crontab -
:这个命令用于将标准输入(stdin)的内容作为 crontab 文件的内容进行更新。如果当前用户没有 crontab 文件,这个命令会创建一个新的。如果已存在,它会替换掉原有的内容。
将这四个部分组合起来,(crontab -l; echo "*/2 * * * * sudo systemsetup -setusingnetworktime on") | crontab -
这条命令的作用是:
首先,通过 crontab -l
列出当前用户的 crontab 文件内容。
然后,使用 echo
将新的定时任务配置添加到这个内容的末尾(尽管实际上,由于管道的作用,这一步并不会直接显示到终端上)。
接着,通过管道将这两个命令的输出(主要是 echo
的输出,因为 crontab -l
的输出会被直接传递给 crontab -
命令)作为 crontab -
命令的输入,从而更新 crontab 文件。
最终,这个新的 crontab 文件会包含原来的任务(如果有的话)和新添加的每两分钟执行一次的 sudo systemsetup -setusingnetworktime on
任务。
然而,需要注意的是,由于 sudo
命令的权限提升问题,直接在 crontab 中使用 sudo
可能会遇到一些问题,特别是如果 sudo
需要密码的话。在 macOS 上,你可以通过配置 sudoers
文件(使用 visudo
命令)来允许无密码执行特定的命令,但这需要谨慎操作以避免安全风险。另外,对于大多数使用场景来说,一旦启用了网络时间同步,就没有必要每两分钟就重新启用一次。因此,这个定时任务可能并不是必要的。
macos 在shell脚本里 执行 crontab -e
在 macOS 或任何类 Unix 系统中,crontab -e
命令用于编辑当前用户的 crontab 文件,这是一个文本文件,其中包含了该用户希望定时执行的命令列表。然而,直接在 shell 脚本中执行 crontab -e
并不适合,因为 crontab -e
命令通常会打开一个文本编辑器(如 Vim、Nano 等),让用户可以编辑 crontab 文件。这个过程是交互式的,不适合自动化脚本。
如果你需要在 shell 脚本中修改 crontab,你可以使用 crontab
命令的 -l
(列出当前 crontab)、-
(从标准输入读取 crontab)和重定向功能来实现。
下面是一个示例,展示了如何在 shell 脚本中添加、修改或删除 crontab 条目:
你可以先将当前的 crontab 内容保存到一个临时文件中,然后修改这个文件,最后再将修改后的内容写回 crontab。
bash复制代码#!/bin/bash
# 备份当前 crontab crontab -l > mycron.tmp
# 检查 mycron.tmp 文件是否存在,如果不存在,则创建一个空的 if [ ! -f mycron.tmp ]; then touch mycron.tmp fi
# 向 mycron.tmp 文件中添加新的 crontab 条目 # 例如,每天中午 12 点执行 /path/to/your/script.sh echo "0 12 * * * /path/to/your/script.sh" >> mycron.tmp
# 将修改后的 crontab 内容写回 crontab mycron.tmp
# 清理临时文件 rm mycron.tmp
如果你需要删除特定的 crontab 条目,你可以使用 sed
或 awk
等工具来编辑临时文件,然后再写回 crontab。
bash复制代码#!/bin/bash
# 备份当前 crontab crontab -l > mycron.tmp
# 使用 sed 删除包含特定命令的行 # 例如,删除所有调用 /path/to/your/script.sh 的行 sed -i '' '/\/path\/to\/your\/script.sh/d' mycron.tmp
# 检查是否还有 crontab 条目,如果没有则删除 crontab if ! [ -s mycron.tmp ]; then crontab -r echo "Crontab has been cleared." else # 将修改后的 crontab 内容写回 crontab mycron.tmp fi
# 清理临时文件 rm mycron.tmp
注意:在 macOS 中使用 sed
时,-i
选项后面需要跟一个空字符串 ''
(如果不需要备份文件的话),这是 macOS sed
命令的一个特殊之处。
使用这种方法,你可以在 shell 脚本中安全地修改 crontab 条目,而无需担心交互式文本编辑器的问题。
macos 在shell脚本里 执行 crontab -e
在 macOS 中使用 shell 脚本来编辑 crontab 任务列表可以通过以下步骤来实现:
首先,你需要知道 crontab
命令用于配置周期性执行的任务。crontab -e
命令会打开一个文本编辑器(通常是 vi
或 nano
),允许你编辑你的 cron jobs。
如果你想在 shell 脚本中执行 crontab -e
,你可以直接在脚本中调用这个命令。但是,由于 crontab -e
实际上是交互式的,并且会等待用户输入,你可能需要在脚本中自动化这个过程。
下面是一个简单的 shell 脚本示例,它将添加一个新的 cron job 到你的 crontab 文件:
Bash深色版本1 #!/bin/bash 2 3 # 定义要添加的 cron job 4 new_cron_job="* * * * * /path/to/your/script.sh" 5 6 # 使用 echo 和 crontab -l | cat - 将新的 cron job 添加到已有的 cron job 列表中 7 echo "$(crontab -l | cat -; echo "$new_cron_job")" | crontab - 8 9 # 检查是否成功添加了 cron job 10 if [ $? -eq 0 ]; then 11 echo "Cron job added successfully." 12 else 13 echo "Failed to add cron job." 14 fi
在这个脚本中,我们首先使用 crontab -l
命令获取当前的 cron job 列表,然后使用 echo
命令添加新的 cron job。cat -
是一个管道操作,用于连接两个命令的输出和输入。最后,我们将整个列表传递给 crontab -
命令以更新 cron job 列表。
请注意,你需要替换 /path/to/your/script.sh
为你要执行的实际脚本路径,并确保你的脚本有正确的执行权限。如果需要,你也可以根据需要修改 cron 表达式或添加更多的 cron job。
如果你想要在脚本中编辑 crontab 文件,但不希望立即保存更改,那么你可能需要创建一个临时文件,让用户编辑该文件,然后让用户决定是否要保存更改。这通常涉及到使用如 EDITOR
环境变量或者特定的编辑器命令行参数来启动编辑器。不过,这种情况下,你仍然需要手动处理从编辑器返回的数据以及如何与 crontab
命令交互。