Php 从CronJob启动Unix.sh文件时工作不正确
问题就在这里。我正在和一个中国跟踪部门一起编写跟踪脚本(不重要)。我的两份文件如下: 7778.phpPhp 从CronJob启动Unix.sh文件时工作不正确,php,linux,bash,shell,unix,Php,Linux,Bash,Shell,Unix,问题就在这里。我正在和一个中国跟踪部门一起编写跟踪脚本(不重要)。我的两份文件如下: 7778.php #!/usr/bin/php -q <?php error_reporting(0); set_time_limit(0); $address = 'SERVER IP'; $port = 7778; $q_count = 1; if (($master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
#!/usr/bin/php -q
<?php
error_reporting(0);
set_time_limit(0);
$address = 'SERVER IP';
$port = 7778;
$q_count = 1;
if (($master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0)
{
echo "socket_create() failed, reason: " . socket_strerror($master) . "\n";
}
socket_set_option($master, SOL_SOCKET,SO_REUSEADDR, 1);
if (($ret = socket_bind($master, $address, $port)) < 0)
{
echo "socket_bind() failed, reason: " . socket_strerror($ret) . "\n";
}
if (($ret = socket_listen($master, SOMAXCONN)) < 0)
{
echo "socket_listen() failed, reason: " . socket_strerror($ret) . "\n";
}
$read_sockets = array($master);
//---- Create Persistent Loop to continuously handle incoming socket messages ---------------------
while (true)
{
$changed_sockets = $read_sockets;
$num_changed_sockets = socket_select($changed_sockets, $write = NULL, $except = NULL, NULL);
foreach($changed_sockets as $socket)
{
if ($socket == $master)
{
if (($client = socket_accept($master)) < 0)
{
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
continue;
}
else
{
array_push($read_sockets, $client);
print "[".date('Y-m-d H:i:s')."] ".$client." CONNECTED "."(".count($read_sockets)."/".SOMAXCONN.")\r\n";
}
}
else
{
$bytes = @socket_recv($socket, $buffer, 2048, 0);
if ($bytes == 0)
{
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
if (socket_close($client))
{
print "Connection closed\r\n";
}
}
else
{
print $buffer."\r\n";
}
print "All Done\r\n";
print "---------------------------------------------------------------------------------------------------------\r\n";
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
if (socket_close($client))
{
print "Connection closed\r\n";
}
}
}
}
?>
现在我要做的是在我的服务器上使用ssh测试脚本,导航到文件目录并键入
“/7778.php”
。这将启动我的php文件,它将打开端口7778,然后我的单元将连接,我的脚本将在屏幕上转储数据/缓冲区。即使我通过键入以下“/port\u start.sh”
从.sh
文件启动脚本,一切都很正常。我还可以使用Putty
并打开一个RAW
到我的服务器和端口的连接,它可以正常工作。不知道它是如何工作的,如下所示。该单元将建立连接,脚本将接受该连接并接收数据,然后关闭连接。当我使用以下代码运行cronjob中的.sh
文件打开端口时,就会出现问题:“*/1****/home/path/to/file/port\u start.sh>/dev/null”。它将打开它,我可以验证它是否打开,但没有任何东西可以连接到它。为什么会这样?从cronjob工作时,计算机无法找到命令程序。如果程序位于/home/root/bin目录中,您应该像/home/root/bin/netstat一样调用它。。。您可以通过运行“locate netstat”和“locate grep”来定位程序。这可能会解决您的问题。非常感谢您的回复。就我而言,这不是问题所在。一切都打开了,一切正常。但是我有一个小脚本来检查端口是否打开。我的问题就发生在那里。当我运行脚本时,它会保持端口打开,但会杀死我的脚本。这就是为什么我可以看到港口仍然开放,但什么也不会发生。
如果有人遇到同样的问题,我用于检查端口的脚本如下所示:
$errno = "";
$errstr = "";
$fp = @fsockopen($domain, $port, $errno, $errstr, 2);
$status = "";
if (!$fp) {
$status = "<img src='red.gif' alt='Status: Down, Domain: $domain, Port: $port ($errstr)'>\n";
}
else
{
$status = "<img src='green.gif' alt='Status: Up, Domain: $domain, Port: $port'>\n";
}
@fclose($fp);
$errno=”“;
$errstr=“”;
$fp=@fsockopen($domain,$port,$errno,$errstr,2);
$status=“”;
如果(!$fp){
$status=“\n”;
}
其他的
{
$status=“\n”;
}
@fclose($fp);
但同样,你的回答有道理,但不适用于我
$errno = "";
$errstr = "";
$fp = @fsockopen($domain, $port, $errno, $errstr, 2);
$status = "";
if (!$fp) {
$status = "<img src='red.gif' alt='Status: Down, Domain: $domain, Port: $port ($errstr)'>\n";
}
else
{
$status = "<img src='green.gif' alt='Status: Up, Domain: $domain, Port: $port'>\n";
}
@fclose($fp);