作者kenduest (小州)
看板Linux
标题Re: [问题] 怎麽离开 at 工作排程
时间Sun Jul 24 00:08:58 2016
※ 引述《abby8050 (LoRdOfCrEaTuRe)》之铭言:
: 在命令列执行
: at now + 1 minute && echo 'Hello'
: 就会进入at prompt
: 接着打Ctrl d
: 就会送出工作
: 请问要如何用命令表达 Ctrl d
: 因为我是要把at的命令写在PHP档的shell_exec()里面
: 例如说
: <?php
: shell_exec("cd /");
: ?>
: 是可以执行的
: 请问shell_exec()里面要怎麽表达ctrl d
首先 at 预设是使用 standard input 读入资料,所以你说到使用 ctrl d 这只是很单纯
用来表示结束标准输入的资料输入,所以程式表示也读到结尾了就知道你要跑的命令内容。
既然如此那转一下,管线方式就可以简单达成这类需求:
echo "date > /tmp/date-result.txt" | at now + 1 minute
复杂一点真的要一堆命令,shell 下比方:
cat << EOF | at now + 1 minute
rm -f /path/backup
cp -a /path2/mydoc /path/backup
EOF
或者是怕麻烦可以先把指令每一行叙述打好变成一个文字档案,然後丢给 at 也可以。
at now + 1 minute < at_script or
cat at_script | at now + 1 minute
当然或者是直接写好变成 shell script,at 只要告知执行该 script 就好:
echo "/path/script.sh" | at now + 1 minute
若你写 php 是希望达成执行 at 然後可以把资料喂给他,也就是直接程式与 at 互动的话
一般会用 popen 方式. 可以查一下 php 本身官方下面的 popen 例子很多程式码参考
http://php.net/manual/en/function.popen.php
比方:
<?php
$command= <<<EOF
ls -l / > /tmp/ls-result.txt
date > /tmp/date-result.txt
EOF;
$handle = popen("at 22:00","w");
fwrite($handle,$command);
fclose($handle);
?>
最後题外话 shell_exec("cd /"); 这样一行叙述实际上执行之後,你後续的程式执行工作
目录都还不会在 / 那边,因为他是 spawn 一个 shell 去执行,执行之後结束该 shell
就消失了。除非你刚好一行内有 cd 到其他目录然後又执行其他命令叙述搭配一起用。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.37.134.65
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1469290141.A.ECB.html
1F:推 Hevak: 推 07/24 00:21
2F:推 Debian: 推荐文章。 07/24 00:27
3F:推 soem: 推荐这篇文章。 07/24 01:03
4F:推 bottomless: 超用心的啊…推一下!!! 07/24 11:59
5F:推 abby8050: 太感谢啦!! 07/24 15:38
6F:推 kenwufederer: 推 07/24 15:59