scp与nohup在背景中不会工作

时间:2016-05-15 13:41:13

标签: scp nohup

##!/bin/bash
FILE=$1;
/usr/bin/nohup /usr/bin/scp -i /var/www/.ssh/XXX -P XXXXX "$FILE" user@ip.com:/dir1/dir2/ &
exit

这是我的shellcript。这是由php调用的:

$sh = "/var/www/shdir/script.sh";
$param = '/path/to/file.mp4';
$exec  = $sh . ' "' . $param . '"';
shell_exec($exec);

这很好,但是我想要传输的文件太大而无法在几秒钟内处理,所以我想在shellcript中使用nohup来在后台运行scp-process。 scp运行,但不在后台运行。我不知道为什么:/

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

此处不需要nohup - 只需直接从TTY分离所有FD并使用disown

#!/bin/bash
file=$1;
/usr/bin/scp -B \
  -i /var/www/.ssh/XXX \
  -P XXXXX \
  "$file" user@ip.com:/dir1/dir2/ \
  </dev/null >/dev/null 2>&1 &
disown

注意:

  • 启用了scp的-B(批处理)选项。
  • stdin,stdout和stderr都被重定向到/dev/null(尽管在调试时你可能会更好地将后两个重定向到日志文件)
  • shebang以#!开头,而不是##!
  • disown用于从shell的作业表中删除进程

更大的问题是shell_exec()使用连接字符串。启动子进程的正确方法直接指定每个argv数组条目。与使用shell(如shell_exec()一样)不同,这可以防止变量执行任意代码(想想名为/uploads/evil-$(rm -rf $HOME)'$(rm -rf $HOME)'.mp4的文件;如果将该名称替换为作为代码执行的字符串,那么有一个非常糟糕的一天,即使你试图使用引号来保护它。)