##!/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运行,但不在后台运行。我不知道为什么:/
感谢您的帮助!
答案 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
注意:
-B
(批处理)选项。/dev/null
(尽管在调试时你可能会更好地将后两个重定向到日志文件)#!
开头,而不是##!
disown
用于从shell的作业表中删除进程更大的问题是shell_exec()
使用连接字符串。启动子进程的正确方法直接指定每个argv
数组条目。与使用shell(如shell_exec()
一样)不同,这可以防止变量执行任意代码(想想名为/uploads/evil-$(rm -rf $HOME)'$(rm -rf $HOME)'.mp4
的文件;如果将该名称替换为作为代码执行的字符串,那么有一个非常糟糕的一天,即使你试图使用引号来保护它。)