欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

macos 在shell脚本里 执行 crontab -e 编辑 expect cron (最好不要使用expect,因为expect有点麻烦,,本页面有不使用expect的例子) 文心一言 AG 通义 chatgpt 有大用 有大大用

#!/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 尝试与一个未成功执行的进程进行交互。

您的脚本解释

  1. 检查 Cron 作业: 脚本首先检查用户 bbbb-admin 的 crontab 是否为空,并检索是否存在指定的启动任务 @reboot 的 cron 任务。

  2. Expect 块expect 部分旨在与 crontab 编辑器交互,然而,这可能在某些情况下不起作用(例如,当 crontab -e 打开一个交互式编辑器时)。

推荐的修改

为了避免使用 expect,建议直接编辑 crontab 文件,可以通过临时文件的方式实现:

修改后的示例脚本,,,, 替换 expect     OK OOK  有大用  有大大用

bash

#!/bin/bash # 创建临时文件存储 crontab TEMP_CRONTAB=$(mktemp) # 将当前 crontab 加载到临时文件中 sudo crontab -u bbbb-admin -l > $TEMP_CRONTAB 2>/dev/null # 检查特定的 cron 作业是否已经存在 if ! grep -q "@reboot /Users/bbbb-admin/app/getinfoscript.sh" $TEMP_CRONTAB; then    # 如果不存在,添加至临时文件  echo "@reboot /Users/bbbb-admin/app/getinfoscript.sh" >> $TEMP_CRONTAB  echo "0 10 * * * /Users/bbbb-admin/app/getinfoscript.sh" >> $TEMP_CRONTAB    # 安装新创建的 crontab  sudo crontab -u bbbb-admin $TEMP_CRONTAB  # 清理临时文件  rm -f $TEMP_CRONTAB else  echo "Cron job 已经存在。" fi

解释

  • 此脚本使用临时文件管理 crontab 条目。

  • 首先加载 bbbb-admin 的当前 crontab,并检查需要的作业是否存在,如果不存在,则进行添加。

  • 最后,将修改后的 crontab 安装回用户。

  • 通过 mktemp 创建的临时文件,确保不会留下多余的文件。

权限

确保运行此脚本的用户有足够的权限来修改 bbbb-admin 用户的 crontab。如果需要,可以使用 sudo 获得相应的权限。





又一个修改后的示例脚本,,,, 替换 expect     OK 有大用

请注意,这仍然假设您已经配置了无密码的 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)来管理时间同步。

下面是对这条命令的详细解释:

  1. crontab -l:这个命令用于列出当前用户的 crontab 文件内容。crontab 文件是一个文本文件,用于存储定时任务的配置。每个任务都有一行配置,指定了任务执行的时间、日期以及要执行的命令。

  2. echo "*/2 * * * * sudo systemsetup -setusingnetworktime on":这个命令使用 echo 将一个字符串输出到标准输出(stdout)。这个字符串是一个 crontab 任务的配置,它指定了一个定时任务,该任务每两分钟(*/2 * * * *)执行一次 sudo systemsetup -setusingnetworktime on 命令。这里的 */2 表示每两小时的每个第 0 分钟和第 30 分钟执行一次,但由于它位于分钟字段,实际上意味着每两分钟执行一次。

  3. |:这个符号是管道(pipe)操作符,它的作用是将前一个命令的输出作为后一个命令的输入。

  4. 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 内容保存到一个临时文件中,然后修改这个文件,最后再将修改后的内容写回 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 条目

如果你需要删除特定的 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 命令会打开一个文本编辑器(通常是 vinano),允许你编辑你的 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 命令交互。




普通分类: